2008-10-31 81 views
28

我有以下的代码,工作只是正常时的方法是“POST”,而是改为“GET”不工作:如何使用HttpWebRequest的使用GET方法

HttpWebRequest request = null; 
request = HttpWebRequest.Create(uri) as HttpWebRequest; 
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
request.Method = "POST"; // Doesn't work with "GET" 

request.BeginGetRequestStream(this.RequestCallback, null); 

我得到了ProtocolViolationException “GET”方法的例外。

编辑:看过使用反射器后,似乎有一个明确的检查“GET”方法,如果它被设置为它抛出异常。

EDIT2:我已经更新了我的代码以下,但它仍然抛出当我打电话EndGetResponse()异常

if (request.Method == "GET") 
{ 
    request.BeginGetResponse(this.ResponseCallback, state); 
} 
else 
{ 
    request.BeginGetRequestStream(this.RequestCallback, state); 
} 

在我的功能,ResponseCallback,我有这样的:

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 

它也抛出异常。

回答

上面的代码现在工作,我已经忘了取出来这是导致异常在年底抛出的Content-Type行。 +1来调整&回答乔恩。

工作代码现在如下:

HttpWebRequest request = null; 
request = HttpWebRequest.Create(uri) as HttpWebRequest; 
request.Method = "GET";// Supports POST too 

if (request.Method == "GET") 
{ 
    request.BeginGetResponse(this.ResponseCallback, state); 
} 
else 
{ 
    request.BeginGetRequestStream(this.RequestCallback, state); 
} 
+0

还是ProtocolViolationException?你能制作一个简短但完整的程序来证明问题吗?你有没有看过线(例如Wireshark),看看发生了什么? – 2008-10-31 14:28:42

+0

感谢您的更新..也解决了我的问题。 – TravisWhidden 2010-01-27 18:09:58

+0

这两种方法是完全不同的 - 'BeginGetResponse`用于制作网页请求,而`BeginGetRequestStream`用于将数据写入流中。 – 2014-04-20 06:52:44

回答

5

是否有意义的GET请求发送内容类型?你尝试删除第三行吗?

1

BeginGetRequestStream用于获取专门用于将数据写入请求的流。这不适用于GET请求。

BeginGetRequestStream方法的文档明确指出,如果方法是GET或HEAD,该方法将抛出ProtocolViolationException。

士气:阅读文档;-)

1

它的说明文件GetRequestStream,它会抛出一个ProtocolViolationException如果方法是GET规定。但是,我找不到HTTP spec中的任何内容来表明这实际上是HTTP协议违规。考虑这个挑战。

相关问题