将文件从外部源传递到.ashx处理程序?

时间:2012-10-24 16:27:58

标签: c# httprequest filestream 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#方法将处理程序命中到对用户进行身份验证的点,但在此之后我不相信文件流正在正确传递。我有一堆错误处理来检查文件上的各种属性..响应应该写回这些错误,但它总是为空。

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

感谢您的帮助!

编辑:

以下是web config中的处理程序注册:

<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[]写入请求流。有点惊讶的是流没有像我期望的那样被写入。这似乎是直截了当的。

1 个答案:

答案 0 :(得分:0)

我要检查的第一件事是web.config中的Handler注册配置。例如,可能只允许接收POST而不允许接收GET。在文件上传方案中使用POST,但在您描述的另一个场景中看起来就像是在使用GET。也许这就是为什么忽略了你的要求。

HTH