1

我正在开发一个使用 Web 服务的 Windows Phone 8 应用程序。这个特定的 Web 服务需要一个带有实体主体的 GET 请求。

我正在使用 System.Net.Http.HttpClient 来发送这个请求,我已经成功地使用它来发送各种其他 Web 请求(GET、POST 和 PUT)。这是第一个包含有效负载的 GET 请求,因此包含 Content-Type 和 Content-Length 标头。

请求失败,并出现如下异常:

“TaskHost.exe”(CLR C:\windows\system32\coreclr.dll:Silverlight AppDomain):已加载“C:\windows\system32\en-US\mscorlib.debug.resources.dll”。模块是在没有符号的情况下构建的。System.Windows.ni.dll 中发生了“System.Net.ProtocolViolationException”类型的异常,并且在托管/本机边界之前未进行处理 mscorlib.ni 中发生了“System.Net.ProtocolViolationException”类型的第一次机会异常。 dll mscorlib.ni.dll 中出现“System.Net.ProtocolViolationException”类型的异常,并且在托管/本机边界之前未处理

尽管根据我的研究,在 GET 请求中包含有效负载有点不寻常,但 RFC 并未明确禁止。

我没有更改网络服务的选项。System.Net.Http.HttpClient 是否完全不允许带有实体主体的 GET?如果没有,是否有任何解决方法?

谢谢你。

4

1 回答 1

1

我知道你问这个已经有一段时间了,但不管怎样,这里还是过去了。

虽然在 GET 请求的正文中发送有效负载可能不会违反 RFC 的客户端,但它确实违反了惯例。RFC所说的是,处理此类请求的服务器没有义务查看请求 URI 和 Host: 标头以外的任何内容,以确定其响应应该是什么。

引用 RFC2616 中的 HTTP 1.1 规范,第 5.2 节说:“Internet 请求标识的确切资源是通过检查 Request-URI 和 Host 标头字段来确定的。” 它没有说明请求正文。

这意味着,即使您尝试执行的操作不违反任何 RFC,您的 WP8 应用程序使用的 Web 服务也是. 如果您别无选择,只能使用它,那么看起来您将不得不推出自己的 HTTP-ish 客户端,我猜您现在可能已经完成了。System.Net.Http.HttpClient 中的现成解决方案不会表现出在与兼容服务器通信时永远不会使用的行为。

于 2013-11-29T14:52:48.303 回答