我正在开发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)

或者如果内容是某些文本 - 返回字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top