2010-06-01 39 views
3

我得到一個「System.Net.ProtocolViolationException:由於該對象的當前狀態操作無效。」試圖調用Silverlight 4.0 - HttpWebRequest拋出ProtocolViolationException

var request = (HttpWebRequest)WebRequest.Create(uri); 

request.Method = "GET"; 

request.ContentType = "text/xml"; 

request.BeginGetRequestStream(RequestCompleted, request); 
+0

在檢查使用谷歌Chrome瀏覽器的開發者工具的網絡流量,我看到clientaccesspolicy.xml託管於Web服務器的根沒有回味。 – cmaduro 2010-06-01 20:55:26

回答

6

我懷疑這可能是因爲您已爲其指定了「GET」方法的請求對象上執行BeginGetRequestStream時出錯。

執行「GET」時,服務器不會期待請求中的實體正文,因此您應該直接前往BeginGetResponse。另外在請求中指定ContentType不是必需的,它指定了在請求的實體主體中發送的內容的類型,但是如前所述,「GET」不發送任何僅獲得內容的內容。

+0

那麼我該如何處理PUT或DELETE呢? – cmaduro 2010-06-01 21:31:36

+1

@cmaduro:那麼PUT(DELETE也沒有實體主體)是你要使用'BeginGetRequestStream'的地方,但是你需要使用ClientHTTP棧,因爲BrowserHTTP棧只支持GET和POST – AnthonyWJones 2010-06-01 21:34:58

+0

我得到一個安全異常。 – cmaduro 2010-06-01 22:17:20

0

我不同意AnthonyW瓊斯的答案。我發現HTTP規範中沒有任何內容禁止包含消息主體的「GET」請求。我認爲這不幸成爲事實上的HTTP如何工作的理解,因爲通常不需要(或方式)包含消息體。話雖如此,他對這個特殊例外的原因是正確的。不過,我認爲BCL應該改爲允許它。

如果任何人都可以指出來我會非常有興趣知道在哪裏規範排除了這一點: HTTP RFC 2616

相關問題