2

我的网络服务器上有一个处理程序。我使用它从处理程序所在站点上的上传工具路由图像。

我通过使用表单的提交操作来做到这一点:

<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 配置中的处理程序注册:

<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
  }

所以现在我将文件转换为 abyte[]然后将其写入byte[]请求流。有点惊讶流没有像我预期的那样被写入。这似乎是直截了当的。

4

1 回答 1

0

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

高温高压

于 2012-10-24T17:06:46.283 回答