【问题标题】:can an ASMX web service response back with Response.BinaryWrite?可以使用 Response.BinaryWrite 回复 ASMX Web 服务吗?
【发布时间】:2014-11-11 14:25:41
【问题描述】:

而不是在 web 方法本身(如 SOAP XML)中返回二进制流(MTOM/Base64 编码),例如:

[WebMethod]
public byte[] Download(string FileName)
....
return byteArray;

此方法能否以某种方式响应(可能通过Server 对象)?:

Response.BinaryWrite(byteArray);

伪:

[WebMethod]
public DownloadBinaryWrite(string FileName)
...
Response.BinaryWrite(byteArray);

【问题讨论】:

标签: c# asp.net web-services webforms asmx


【解决方案1】:

是的,这是可能的。您需要将返回类型更改为 void,因为我们将直接写入响应,并且您需要手动设置内容类型并结束响应,以便它不会继续处理并发送更多数据。

[WebMethod]
public void Download(string FileName)
{
    HttpContext.Current.Response.ContentType = "image/png";
    HttpContext.Current.Response.BinaryWrite(imagebytes);
    HttpContext.Current.Response.End();
}

请注意,现在 WebMethod 是 not really supported,您应该切换到 Web APIWCF(如果您需要 SOAP 支持)。

【讨论】:

  • 我试过了,你是对的。发送一个soapaction而不得到一个soap响应似乎还是有点奇怪。当然不能与一般的 SOAP 客户端互操作,但是如果您不需要它,为什么要关心它。如果调用者期望 SOAP(如 .NET Web 参考),它可能会感到困惑(不,我没有尝试那么远;也许它会起作用,但似乎不太可能)。
  • Response 未被识别为有效对象。
  • @zig 然后使用HttpContext.Current.Response
  • 谢谢!顺便说一句,我们为什么需要HttpContext.Current.Response.End()
  • @zig 也许可以删除它。但是结束响应可以确保没有额外的数据被写入客户端(这可能会损坏文件),并且当前线程将结束,因为它会抛出 ThreadAbortException。
【解决方案2】:

如果你想做 BinaryWrite,你可能想写一个单独的 IHttpHandler 而不是 web 方法。 Web 方法以 SOAP 为导向,因此将它们破解为自定义响应,虽然可能,但有点奇怪。

【讨论】:

  • 我需要将它保存在 Web 服务本身中。或至少在同一个 ASMX 中(我宁愿避免这种情况)。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2011-02-09
  • 2020-02-25
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多