【问题标题】:Passing a file from an external source to a .ashx handler?将文件从外部源传递到 .ashx 处理程序?
【发布时间】:2012-10-24 16:27:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# httprequest filestream ashx


    【解决方案1】:

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

    HTH

    【讨论】:

    • 我编辑并添加了处理程序的注册.. 我不相信我已经以一种或另一种方式专门配置了它?
    • 是的,接受所有动词。嗯,这很容易。运行附加了调试器的应用程序。在 Upload.ashx 的 ProcessRequest 中放置一个断点。然后打开浏览器,输入处理程序的 url:localhost/Upload.ashx,它应该会遇到断点。如果不是,那是不正确的。
    • 我将尝试将调试器附加到处理程序并尽快报告。谢谢。
    • 啊哈,你是如何传递文件的?
    • 我回来将此标记为答案.. 我忘了抱歉。原来,web.config 的发布模式设置不同,这导致了问题与我的本地调试相比。所以最后,这是一个配置问题。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2017-11-09
    • 2023-03-06
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多