如何将HTTPResponse从ASMX Web服务返回到消费者网页
-
08-07-2019 - |
题
我正在开发ASMX网络服务;尝试创建一个方法,从服务器下载文档并在浏览器中显示文档(调用.aspx网页)。我的服务构建没有错误,但当我尝试“添加Web引用”时,我收到以下错误在我的Proxy类项目中:
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...
}
}
}
我看到我对如何从Web服务向请求的网页发送HttpResponse感到困惑。有人可以给我一个如何做到这一点的小费吗?谢谢。
解决方案
您应该查看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接口允许您像站点中的任何其他页面一样使用SESSION对象。如果您不需要,请将其关闭。
本网站介绍了如何创建一个。忽略第4步,因为你可能不关心这一点。
假设您有一个常规页面(aspx),其中包含指向您文档的链接:aspx文件中的链接实际上会直接指向您的ashx处理程序。例如:
<a href="/document.ashx?id=blah">Click Here</a>
然后,ashx处理程序的ProcessRequest方法中的代码将执行所需的任何调用(例如与您的DLL对话)以找到文档,然后通过context.Response.BinaryWrite方法调用将其流回浏览器。
其他提示
这不是标准ASMX Web服务的工作方式。如果你想制作自己的处理程序,甚至使用ASPX页面来提供文档,你很好,但这样做的标准ASMX Web服务方法实际上是将文档的位作为编码blob返回。
如果你想自己动手,请考虑这篇文章: http://msdn.microsoft.com/en-us/magazine/cc163879。 ASPX
web smethod(来自asmx)返回一个可以序列化的对象。
您需要创建方法,如:
[WbeMethod] public byte [] DownloadDocument(string URI)
或者如果内容是某些文本 - 返回字符串。