为了展示 .NET 中的这个基本问题以及这个问题的原因,我编写了一个简单的测试 Web 服务,其中包含一个方法 (EditString),以及一个调用它的消费者控制台应用程序。
它们都是通过文件/新建项目等创建的标准 Web 服务/控制台应用程序,所以我不会列出整个代码 - 只是有问题的方法:
网络方法:
[WebMethod]
public string EditString(string s, bool useSpecial)
{
return s + (useSpecial ? ((char)19).ToString() : "");
}
[您可以看到,如果 useSpecial 为 false,它只会返回字符串 s。如果 useSpecial 为真,则返回 s + char 19。]
控制台应用程序:
TestService.Service1 service = new SCTestConsumer.TestService.Service1();
string response1 = service.EditString("hello", false);
Console.WriteLine(response1);
string response2 = service.EditString("hello", true); // fails!
Console.WriteLine(response2);
[第二个响应失败,因为该方法返回 hello + 一个特殊字符(为了参数的缘故,ascii 代码为 19)。]
错误是:
XML 文档中存在错误 (1, 287)
内部异常:“'',十六进制值 0x13,是无效字符。第 1 行,位置 287。”
有几点值得一提:
当直接浏览到 ASMX 文件(例如
http://localhost:2065/service1.asmx
)并通过它运行该方法(使用与控制台应用程序中相同的参数)时,Web 方法本身可以正常工作 - 即显示带有字符串 hello + char 19 的 XML。以其他方式检查序列化的 XML 表明特殊字符被正确编码(服务器端似乎没问题,这很好)
所以看起来客户端有问题 - 即.NET生成的代理类代码不处理特殊字符
这是一个更大项目的一部分,其中对象被传入和传出 Web 方法 - 包含字符串属性 - 这些是正常工作所需要的。即我们正在反序列化类。
有关解决方法以及如何实施的任何建议?
还是我完全错过了一些非常明显的东西!!?
PS。我没有太多运气让它使用 CDATA 标记(.NET 是否支持这些开箱即用?)。