C# Web服务失败,因为(400)由于特殊字符而导致错误请求
使用VisualStudio2008,我设置了一个使用Web服务的客户端。 它与缓冲区大小无关(因为这是一个典型的响应,所有适当的大小都增加了) 我使用列表作为方法的参数。 经过多次实验,我使用System.Net.WebClient手动创建一个Soap 1.1和一个Soap 1.2请求来测试结果C# Web服务失败,因为(400)由于特殊字符而导致错误请求,c#,.net,asp.net,winforms,C#,.net,Asp.net,Winforms,使用VisualStudio2008,我设置了一个使用Web服务的客户端。 它与缓冲区大小无关(因为这是一个典型的响应,所有适当的大小都增加了) 我使用列表作为方法的参数。 经过多次实验,我使用System.Net.WebClient手动创建一个Soap 1.1和一个Soap 1.2请求来测试结果 using (var webCtx = new System.Net.WebClient()) { webCtx.Headers.Add(System.Net.HttpRequestHeader.
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>
;123
如果UnicodeString的值很简单(即123),但一旦特殊字符出现,我就会收到400个错误请求
现在,我发现了一篇Microsoft知识库文章,描述了这个bug,基本上是说安装了一个热修复程序。这真的不是解决问题的办法,所以我想知道有没有办法解决这个问题
编写某种自定义编码/解码或自定义绑定的唯一解决方案是由服务器和客户端实现的吗?有没有更简单的办法
谢谢
编辑:
列表的使用不是问题,因为它是由VS处理的。这里是soap消息的更完整(但仍然是部分)的内容
<HelloWorld xmlns="http://tempuri.org/">
<pocoList>
<PocoClass>
<UnicodeString>123</UnicodeString>
</PocoClass>
</pocoList>
</HelloWorld>
;123
我关心的是,您将列表用作方法的参数。Web服务不直接支持列表。您需要使用数组作为参数。然后在内部可以使用.ToList()将其转换为列表。这可能不是你的直接问题 该KB文章所指的是请求URL中的unicode字符集,而不是发布到服务器的实际数据
话虽如此,;我会验证你的标题是否格式正确
另外,如果VS为您生成了客户端代理;右键单击服务引用,然后单击“更新服务引用”
只是注意到了一件事;你说你正在传递一个列表作为参数;从所示的xml片段来看,这看起来不像是从列表中序列化的内容(由任何.NET xml序列化程序);如果您想使用webclient方法进行调试;尝试验证xml的格式是否有效。您在哪里看到
代码>?在原始XML还是序列化数据中?XML被定义为只包含人类可读的字符和
是不可读的ASCII移出字符的XML实体。如果您查看的是原始XML,并且它包含XML实体代码,这是允许的,但是如果您查看的是序列化数据,并且您的XML文档包含原始控制字符,则它无效,将被拒绝。我在一个Web服务中遇到了类似的问题,我们的应用程序用户运行在线帐户搜索。我发现了一个问题,但看起来微软是故意考虑这种行为的
我们最终编写了一个方法,用问号替换序列化为XML时不允许使用的所有字符
允许的列表为:0x09、0x0a、0x0d、0x20-0xd7ff和0xe000-0xfffd。其他一切,我们都转向了“?”
我想如果你不能做到这一点,数据应该在传输过程中进行base64编码以避免这个问题。对我来说似乎有点奇怪,因为它破坏了通过web服务无损路由调用的能力。List与T[]对我所知道的ASMX中的序列化没有影响。