2

我正在开发一个 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 服务发送回请求网页感到困惑。有人可以给我一个关于如何做到这一点的提示吗?谢谢。

4

3 回答 3

4

您应该查看 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 页面一样处理获取/发布请求。关键是要减少运行常规 aspx 页面所产生的开销,因为您需要做的就是返回一些简单的内容(如文件...)或执行快速操作。

IRequiresSessionState 接口允许您像站点中的任何其他页面一样使用 SESSION 对象。如果您不需要它,请不要使用它。

这个网站有一个有趣的演练如何创建一个。忽略第 4 步,因为您可能不关心这一点。

假设您有一个常规页面 (aspx),其中包含指向您的文档的链接: aspx 文件中的链接实际上将直接指向您的 ashx 处理程序。例如:

<a href="/document.ashx?id=blah">Click Here</a>

然后,ashx 处理程序的 ProcessRequest 方法中的代码将执行所需的任何调用(例如与您的 DLL 对话)以定位文档,然后通过 context.Response.BinaryWrite 方法调用将其流式传输回浏览器。

于 2009-03-10T22:43:21.020 回答
1

这不是标准 ASMX Web 服务的工作方式。如果您想创建自己的处理程序,或者甚至使用 ASPX 页面来传递文档,那么您很好,但是执行此操作的标准 ASMX Web 服务方法实际上是将文档的位作为编码的 blob 返回。

如果您想自己动手,请考虑这篇文章:http: //msdn.microsoft.com/en-us/magazine/cc163879.aspx

于 2009-03-10T21:49:27.433 回答
0

web 方法(来自 asmx)返回一个可以序列化的对象。

您需要创建您的方法,如:

[WbeMethod] public byte[] 下载文档(字符串 URI)

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

于 2009-03-10T21:54:40.900 回答