我的网络服务器上有一个处理程序。我使用它从处理程序所在站点上的上传工具路由图像。
我通过使用表单的提交操作来做到这一点:
<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[]
请求流。有点惊讶流没有像我预期的那样被写入。这似乎是直截了当的。