2012-10-24 71 views
2

我在我的web服务器上有一个处理程序。我使用它来处理处理程序所在站点上的上载工具的图像。将文件从外部源传递给.ashx处理程序?

我这样做是通过使用表单的提交操作:

<form id="fileupload" action="~/handlers/Upload.ashx" method="post" enctype="multipart/form-data"> 

现在,我需要公开此处理外用(从一个应用程序或其他来源,是不是我的网站,等等)。

我试图构建一个使用同样的方法,一个单独的测试项目中,只有表单动作是URL到我的处理程序:

<form id="fileupload" action="http://mywebsite/handlers/Upload.ashx" method="post" enctype="multipart/form-data"> 

而且,我已经手动试图建立请求并通过流:

using (var stream = File.OpenRead(FILE_PATH)) 
{ 
    var httpRequest = WebRequest.Create(UPLOADER_URI) as HttpWebRequest; 
    httpRequest.Method = "POST"; 
    stream.Seek(0, SeekOrigin.Begin); 
    stream.CopyTo(httpRequest.GetRequestStream()); 

    var httpResponse = httpRequest.GetResponse(); 
    StreamReader reader = new StreamReader(httpResponse.GetResponseStream()); 
    var responseString = reader.ReadToEnd(); 

    //Check the responsestring and see if all is ok 
} 

在处理程序所在的站点上使用表单的第一种方法正如我所期望的那样工作。 :)

从外部使用该方法根本没有收到响应。

C#方法将处理程序点击到验证用户身份的位置,但在此之后,我不相信文件流正在正确传递。我有一堆错误处理来检查文件上的各种属性..响应应该写回这些错误,但它总是空的。

任何建议或意见将不胜感激。

谢谢你的帮助!

编辑:

这里是网络配置的程序登记:

<add name="Upload" path="Upload.ashx" verb="*" type="mynamespace.Upload" resourceType="Unspecified" preCondition="integratedMode" /> 

编辑:

设置我的远程调试,以确定该处理器被打在我的C#示例。但是请求中没有文件。 stream.CopyTo()不能是我正在寻找的正确的电话吗?

有什么想法?

编辑:

我如何修改该文件正在通过一点点。但是,当我遇到处理程序时,request.Files是空的。下面是修改后的代码:

const string FILE_PATH = "C:\\image.jpg"; 
string UPLOADER_URI = string.Format("http://localhost//handlers/Upload.ashx"); 

using (var stream = File.OpenRead(FILE_PATH)) 
{ 
    var httpRequest = WebRequest.Create(UPLOADER_URI) as HttpWebRequest; 
    httpRequest.Method = WebRequestMethods.Http.Post; 
    httpRequest.AllowWriteStreamBuffering = true; 
    httpRequest.ContentType = "binary/octet-stream"; 

    stream.Seek(0, SeekOrigin.Begin); 

    byte[] bArray = new byte[stream.Length]; 

    stream.Read(bArray, 0, Convert.ToInt32(stream.Length)); 

    httpRequest.ContentLength = bArray.Length; 

    Stream rStream = httpRequest.GetRequestStream(); 
    rStream.Write(bArray, 0, bArray.Length); 
    rStream.Close(); 

    var httpResponse = httpRequest.GetResponse(); 
    StreamReader reader = new StreamReader(httpResponse.GetResponseStream()); 
    var responseString = reader.ReadToEnd(); 

    //Check the responsestring and see if all is ok 
    } 

所以现在我将文件转换为byte[],然后编写byte[]请求流。像我期望的那样,这条河并没有被写入。这似乎挺直的。

回答

0

我要检查的第一件事是web.config中的Handler注册配置。例如,可能只允许接收POST和没有GET。在文件上传方案中使用POST,但在另一种情况下,您描述的看起来像是使用GET。也许这就是为什么忽视你的请求。

HTH

+0

我编辑和添加注册的处理程序。我不认为我有它特别配置的一种方式或其他? –

+0

yep接受所有动词。那很容易。使用附加的调试器运行应用程序。在Upload.ashx的ProcessRequest中放置一个断点。然后打开一个浏览器,输入处理程序的URL:http://localhost/Upload.ashx,它应该到达断点。如果不是不正确的话。 – Marcote

+0

我会尝试将调试器附加到处理程序并很快回来。谢谢。 –

相关问题