银光 4.0 - HttpWebRequest 抛出 ProtocolViolationException

3
我在调用时遇到了“System.Net.ProtocolViolationException: Operation is not valid due to the current state of the object.”错误。
 var request = (HttpWebRequest)WebRequest.Create(uri);

 request.Method = "GET";

 request.ContentType = "text/xml";

 request.BeginGetRequestStream(RequestCompleted, request);

通过使用Google Chrome的开发者工具检查网络流量,我发现托管在Web服务器根目录下的clientaccesspolicy.xml文件未被检索到。 - cmaduro
2个回答

6
我怀疑这是因为您正在对指定了“GET”方法的请求对象执行BeginGetRequestStream操作。
当执行“GET”时,服务器不会期望请求中有实体主体,因此您应该直接进入BeginGetResponse。同时,在请求中指定ContentType是不必要的,它指定了请求实体主体中发送的内容类型,但如上所述,“GET”不会发送任何内容,而只获取内容。

那么我该如何处理PUT或DELETE请求呢? - cmaduro
1
@cmaduro: 在使用PUT(DELETE也无实体主体)时,您将使用BeginGetRequestStream,但是您需要使用ClientHTTP堆栈,因为BrowserHTTP堆栈仅支持GET和POST。 - AnthonyWJones

0

我不同意AnthonyWJones的回答。我在HTTP规范中没有发现任何禁止“GET”请求包含消息正文的内容。我认为,由于通常没有必要(或者没有办法)包含消息正文,这已经不幸地成为了HTTP工作方式的事实标准理解。话虽如此,他对这个特定异常的原因是正确的。然而,我认为应该更改BCL以允许它。

如果有人能指出我很感兴趣的规范的位置,请让我知道: HTTP RFC 2616


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接