4

当我尝试使它HttpWebRequest返回System.Net.ProtocolViolationException错误时。

private void txtGo_Click(object sender, RoutedEventArgs e)
    {
        WebRequest client =
            WebRequest.Create("http://api.worldweatheronline.com/free/v1/weather.ashx?q=London&format=json&num_of_days=5&key=jdbcn8yuwebwybxjpqzzxyhy");
        client.ContentType = "application/json";
        client.BeginGetResponse(ReadWebRequestCallBack, client);
    }

    private void ReadWebRequestCallBack(IAsyncResult callBackResult)
    {
        var myRequest = (HttpWebRequest) callBackResult.AsyncState;
        if(myRequest != null)
        {
            try
            {
                var response = (HttpWebResponse)myRequest.EndGetResponse(callBackResult);
                txtContent.Text = response.StatusCode.ToString();
            }
            catch(WebException ex)
            {
                txtContent.Text = ex.Message;
            }
        }
    }

当我删除此行时client.ContentType = "application/json";,会出现以下不同的错误

 {System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
   at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult  asyncResult)
  at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState)
  at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at MyClimate.MainPage.ReadWebRequestCallBack(IAsyncResult callBackResult)}
base: {System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
   at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult as yncResult)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.   <EndGetResponse>b__d(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at MyClimate.MainPage.ReadWebRequestCallBack(IAsyncResult callBackResult)}
   Response: {System.Net.Browser.ClientHttpWebResponse}
   Status: UnknownError
4

3 回答 3

4

你会得到这个System.Net.ProtocolViolationException,因为你没有任何Postget方法。希望这会帮助你。

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Uri);

        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)";
        request.CookieContainer = cookie;
        request.AllowAutoRedirect = true;
        // Set the Method property to 'POST' to post data to the URI.
        request.Method = "POST";

        // start the asynchronous operation
        request.BeginGetRequestStream(new AsyncCallback(CRequest), request);
于 2013-05-14T06:05:45.067 回答
3

这里有三个问题。首先删除client.ContentType = "application/json";,因为您的请求方法是 GET 并且ContnetType在 GET 中没有意义。第二个问题是你的模拟器的互联网连接检查模拟器虚拟机的这个设置。

  • 在 Hyper-V 管理器中
  • 单击模拟器虚拟机设置
  • 单击 Windows Phone Emulator External Interface 选择名称以您的物理网络设备名称开头的虚拟交换机。

有关详细信息,请参阅Windows Phone 8 模拟器故障排除

在此处输入图像描述 第三个问题是从 UI 线程以外的另一个线程更新 UI 控件 (TextBox)。

改变

   txtContent.Text = response.StatusCode.ToString();

   Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
      txtContent.Text = response.StatusCode.ToString();
   });
于 2013-05-27T17:42:22.493 回答
0

您可以像这样使用它将适用于您的代码

只需写 client.ContentType = "application/x-www-form-urlencoded"; client.Method = "POST"; 在您的 txtGo_click 按钮中并在您的代码中使用此方法

    private void ReadWebRequestCallBack(IAsyncResult callBackResult)
    {
        var myRequest = (HttpWebRequest)callBackResult.AsyncState;
        if (myRequest != null)
        {
            try
            {
                HttpWebResponse response = (HttpWebResponse)myRequest.EndGetResponse(callBackResult);
                Dispatcher.BeginInvoke(delegate() { txtContent.Text = response.StatusCode.ToString(); });
            }
            catch (WebException ex)
            {
                Dispatcher.BeginInvoke(delegate() { txtContent.Text = ex.Message; });
            }
        }
    }
于 2013-09-05T09:41:27.267 回答