1

为了展示 .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 是否支持这些开箱即用?)。

4

2 回答 2

0

您将需要使用 byte[] 而不是字符串。

于 2009-05-17T17:56:19.900 回答
0

我正在考虑一些可能对您有所帮助的选项。您可以使用 html 实体而不是 char(19) 来选择路线。或者如您所说,您可能想要使用 CDATA。

要提出一个干净的解决方案,您可能不想将整个内容放在 CDATA 中。我不确定您为什么认为 .NET 可能不支持它。您是在序列化的背景下这么说的吗?

于 2009-05-17T19:24:49.007 回答