2012-08-14 80 views
2

我是silverlight的新手。我在Visual Studio 2010中为Windows phone编程。 我尝试做HttpWebRequest但调试器说ProtocolViolationException。 这是我的代码当我做BeginGetRequestStream时为什么会得到ProtocolViolationException

private void log_Click(object sender, RoutedEventArgs e) 
     { 
      //auth thi is my url for request 
      string auth; 
      string login = Uri.EscapeUriString(this.login.Text); 
      string password = Uri.EscapeUriString(this.pass.Password); 
      auth = "https://api.vk.com/oauth/token"; 
      auth += "?grant_type=password" + "&client_id=*****&client_secret=******&username=" + login + "&password=" + password + "&scope=notify,friends,messages"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(auth); 
      request.BeginGetRequestStream(RequestCallBack, request);//on this line debager say ProtocolViolationExceptio 
     } 

     void RequestCallBack(IAsyncResult result) 
     { 
      HttpWebRequest request = result.AsyncState as HttpWebRequest; 
      Stream stream = request.EndGetRequestStream(result); 
      request.BeginGetResponse(ResponceCallBack, request); 
     } 
     void ResponceCallBack(IAsyncResult result) 
     { 
      HttpWebRequest request = result.AsyncState as HttpWebRequest; 
      HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse; 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       string a =sr.ReadToEnd(); 
       MessageBox.Show(a); 
      } 

     } 
+0

你忘了清理一个客户机秘密/ ID对 – Dani 2012-08-14 15:19:05

+0

有人可以给我工作代码的HttpWebRequest? – user1597524 2012-08-14 15:35:15

回答

4

我认为这个问题是你不使用POST,但得到。试试这个:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(auth); 
request.Method = "POST"; 
request.BeginGetRequestStream(RequestCallBack, request); 
+0

我必须得到请求 – user1597524 2012-08-14 15:24:24

+0

@ user1597524然后你不得在流中写任何东西。在GET请求中包含内容违反了HTTP协议。这违反了协议。我不知道WebRequest会立即抛出这个异常(而不是让你设置“POST”,“PUT”等作为之后和获得响应之前的方法),但是我肯定会期望在某个时刻出现ProtocolViolationException 。 – 2012-08-14 16:39:41

0

当你得到它时,你甚至没有对请求流做任何事情。

HttpWebRequest假设您试图获取它的原因是为其写入内容(毕竟是获取它的唯一原因)。

由于您不允许在GET请求中包含内容,因此它意识到您可以对该流执行的唯一操作就是违反HTTP协议。作为使用HTTP协议的工具,阻止你犯这个错误是它的工作。

所以它抛出ProtocolViolationException

删除关于请求流的位 - 它仅适用于POST和PUT。直接去GetResponse()BeginGetResponse()那个时候。

相关问题