【问题标题】:How to return HTTPResponse from ASMX web service to consumer web page如何从 ASMX Web 服务返回 HTTPResponse 到消费者网页
【发布时间】:2009-03-10 21:41:17
【问题描述】:

我正在开发一个 ASMX Web 服务;尝试创建一种方法,该方法将从服务器下载文档并在浏览器中显示该文档(调用 .aspx 网页)。我的服务构建没有错误,但是当我尝试在代理类项目中“添加 Web 引用”时出现以下错误:

System.Web.HttpResponse 无法序列化,因为它没有无参数构造函数。

这是 .ASMX 文件中代码的 sn-p:

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-services download httpresponse


    【解决方案1】:

    您应该查看 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 对象。如果您不需要它,请不要使用它。

    This site 对如何创建一个有趣的演练。忽略第 4 步,因为您可能对此并不关心。

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

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

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

    【讨论】:

    • 嗨,克里斯,谢谢。我正在努力理解这个听起来不错的建议(尽管我有很多东西要研究......)。这个 .ashx 文件会去哪里?此时,我有一个引用 myProxyClass.DLL 的 .aspx 页面,它调用我的 .asmx 服务。 .ashx 是 .asmx 的替代品吗?
    • 哇,在您昨天添加的澄清更新和您提供的链接之间,.ASHX 突然变得更容易理解了。到一天结束时,我已经实现了我的新 .ASHX,它调用了我的 .ASMX,就像我以前尝试从我的 .ASPX 调用 Web 服务失败一样。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      你需要像这样创建你的方法:

      [Wbe方法] 公共字节[] 下载文档(字符串 URI)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多