Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web服务失败,因为(400)由于特殊字符而导致错误请求_C#_.net_Asp.net_Winforms - Fatal编程技术网

C# Web服务失败,因为(400)由于特殊字符而导致错误请求

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.

使用VisualStudio2008,我设置了一个使用Web服务的客户端。 它与缓冲区大小无关(因为这是一个典型的响应,所有适当的大小都增加了)

我使用列表作为方法的参数。 经过多次实验,我使用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>&#xE;123</UnicodeString>
</PocoClass>

;123
如果UnicodeString的值很简单(即123),但一旦特殊字符出现,我就会收到400个错误请求

现在,我发现了一篇Microsoft知识库文章,描述了这个bug,基本上是说安装了一个热修复程序。这真的不是解决问题的办法,所以我想知道有没有办法解决这个问题

编写某种自定义编码/解码或自定义绑定的唯一解决方案是由服务器和客户端实现的吗?有没有更简单的办法

谢谢

编辑: 列表的使用不是问题,因为它是由VS处理的。这里是soap消息的更完整(但仍然是部分)的内容

<HelloWorld xmlns="http://tempuri.org/">
  <pocoList>
    <PocoClass>
      <UnicodeString>&#xE;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中的序列化没有影响。