使用Visual Studio 2008,我设置了一个使用Web服务的客户端。 它与缓冲区大小无关(因为这是典型的响应,所有适当的大小都会增加)。
我使用List作为Method的参数。 经过大量实验,我使用System.Net.WebClient手动创建Soap 1.1和Soap 1.2请求来测试结果。
using (var webCtx = new System.Net.WebClient())
{
webCtx.Headers.Add(System.Net.HttpRequestHeader.ContentType, "text/xml");
webCtx.Headers.Add("SOAPAction", "http://tempuri.org/HelloWorld");
var uri = new Uri("http://localhost:12345/MyProject/WebService.asmx");
MessageBox.Show(webCtx.UploadString(uri, xml));
}
其中xml是具有实际数据的xml的字符串变量。 问题是当其中一个字段具有特殊字符时。以下是xml的消息正文的示例。
<PocoClass>
<UnicodeString>123</UnicodeString>
</PocoClass>
如果UnicodeString的值很简单(即123),但一旦出现特殊字符,我就得到400 Bad Request。
现在,我找到了一篇描述错误kb911276的Microsoft知识库文章,它基本上说明了安装一个hotfix。这真的不是可以解决问题的方法,所以我想知道是否有任何关于如何解决这个问题的想法?
编写某种自定义编码/解码或自定义绑定的唯一解决方案是由服务器和客户端实现的吗?有没有更简单的想法?
由于
编辑: 使用List不是问题,因为它由VS处理。这是肥皂信息的更完整(但仍然是部分)的内容。
<HelloWorld xmlns="http://tempuri.org/">
<pocoList>
<PocoClass>
<UnicodeString>123</UnicodeString>
</PocoClass>
</pocoList>
</HelloWorld>
答案 0 :(得分:3)
我的网络服务遇到了类似问题,我们的应用用户运行在线帐户搜索。我找到了一个VS Feedback item about this,但MS似乎在考虑这种行为。
我们最终做的是编写一个方法来替换序列化为带问号的XML时不允许的所有字符。
允许的列表是:0x09,0x0a,0x0d,0x20-0xd7ff和0xe000-0xfffd。其他一切,我们转向“?”。
我想如果你不能这样做,数据应该在传输中进行base64编码以避免这个问题。对我来说似乎有点奇怪,因为它破坏了通过Web服务无损地路由呼叫的能力。
答案 1 :(得分:0)
我关注的是您声明使用List作为方法的参数。 Web服务不直接支持列表。您需要使用数组作为参数。然后在内部,您可以使用.ToList()将其转换为列表。这可能不是你直接的问题!
答案 2 :(得分:0)
该KB文章指的是请求URL中的unicode字符集,而不是发布到服务器的实际数据。
有人说;我会验证你的标题是否格式正确。
另外,如果VS为您生成了客户端代理;右键单击服务引用,然后单击“更新服务引用”
刚注意到一件事;你说你在列表中作为参数传递;从显示的xml片段看,它看起来不像是从列表中序列化的东西(通过任何.NET xml序列化器);如果你想使用webclient方法进行调试;尝试验证xml的格式是否有效。
答案 3 :(得分:0)
您在哪里看到
?在原始XML或序列化数据中? XML定义为仅包含人类可读的字符,
是不可读的ASCII Shift-Out字符的XML实体。如果您正在查看原始XML并且它包含XML实体代码,那是允许的,但是如果您查看序列化数据并且您的XML文档包含原始控制字符,则它将无效并将被拒绝。