我正在开发 ASMX Web 服务;尝试创建一个方法,从服务器下载文档并在浏览器中显示该文档(调用 .aspx 网页)。我的服务构建没有错误,但当我尝试在代理类项目中“添加 Web 引用”时出现以下错误:
System.Web.HttpResponse 无法序列化,因为它没有无参数构造函数。
以下是 .ASMX 文件中的代码片段:
public class FileService : System.Web.Services.WebService
{
[WebMethod]
public void DownloadDocument(string URI, HttpResponse httpResponse)
{
int DownloadChunkSize = (int)Properties.Settings.Default.DownloadChunkSize;
// some more code here....
using (httpResponse.OutputStream)
{
// more code here...
}
}
}
我发现我对如何将 HttpResponse 从 Web 服务发送回请求网页感到困惑。有人可以给我一个关于如何执行此操作的提示吗?谢谢。
最佳答案
您应该研究 Web 处理程序 (.ashx)。它们非常适合您想要实现的目标。
例如:
public class Download : IHttpHandler, IRequiresSessionState {
public void ProcessRequest(HttpContext context) {
var pdfBytes = /* load the file here */
context.Response.ContentType = @"Application/pdf";
context.Response.BinaryWrite(pdfBytes);
context.Response.End();
}
}
更新: ashx 处理程序实际上是 aspx 的替代品。基本上,它没有 UI,但仍然像 aspx 页面一样处理 get/post 请求。重点是当您需要做的只是返回一些简单的内容(如文件...)或执行快速操作时,减少运行常规 aspx 页面所产生的开销。
IRequiresSessionState 接口(interface)允许您像站点中的任何其他页面一样使用 SESSION 对象。如果您不需要它,请将其关闭。
This site关于如何创建一个有趣的演练。忽略第 4 步,因为您可能不关心它。
假设您有一个常规页面 (aspx),其中包含指向您的文档的链接:aspx 文件中的链接实际上直接指向您的 ashx 处理程序。例如:
<a href="/document.ashx?id=blah">Click Here</a>
然后,ashx 处理程序的 ProcessRequest 方法中的代码将执行所需的任何调用(例如与 DLL 对话)来定位文档,然后通过 context.Response.BinaryWrite 方法调用将其流式传输回浏览器。
关于web-services - 如何从 ASMX Web 服务返回 HTTPResponse 到消费者网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632397/