我编写了一个 ASMX Web 服务,它已经在生产环境中运行多年。今天,Java 客户端在尝试解析响应时突然抛出错误。我们将其追踪到出现在 XML 声明之前的 BOM(字节顺序标记):
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 12.0.0.6300
Date: Wed, 22 Jun 2011 19:59:49 GMT
Content-Length: 3629
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap...
代码一年多没有改变。Web 服务在 IIS 中的 MOSS 2007 站点下运行,正如您从上面的 HTTP 标头中看到的那样,但有自己的 web.config。
据我们所知,服务器的配置没有任何重大变化,但一定是有什么。有什么想法可能导致这种情况吗?
如果我们无法追踪并恢复更改,下一个问题是,我可以在我的代码中解决这个问题吗?
这是一个带有 .asmx 文件的普通 ASMX Web 服务,如下所示:
<%@ WebService Language="c#" Codebehind="MyStuff.asmx.cs" Class="MyStuff.MyService" %>
和 .asmx.cs 文件,如下所示:
public class MyService : System.Web.Services.WebService {
...
[WebMethod(CacheDuration = 30, Description = "This does something", MessageName = "GetMyStuff")]
public XmlDocument GetMyStuff(string param) {
return doGetStuff(param)
}
private XmlDocument doGetStuff(string param) {
...
}
}
我看过一些讨论 BOM 问题的帖子,但由于我只是返回一个 XML 文档,并且框架正在处理流回客户端的问题,我不确定我是否可以对此做任何事情。
更新:我发现我们的舞台服务器上不存在 BOM 问题。另一个线索可能是;当 soapUI 显示来自 prod 的原始响应时,它具有 BOM 并且 SOAP XML 看起来已格式化(多行和缩进)。当我在舞台上看时,没有 BOM,整个响应都在一条线上。所以其他的也与 BOM 一起添加。