HttpWebRequest を使用しようとすると ProtocolViolationException が発生するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/2480258

  •  21-09-2019
  •  | 
  •  

質問

分かりません。Windows Phone 用に構築しているアプリの REST サービスから XML を取得しようとしています。次の行で常に例外が発生します。

HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;

次の設定があります(不正な URL は無視してください。これは単なる例です。)

HttpWebRequest request = WebRequest.Create("https://domain.chargify.com/customers.xml") as HttpWebRequest;
NetworkCredential credentials = new NetworkCredential("appkeyhere", "password");
request.Credentials = credentials;
request.Method = "GET";
request.ContentType = "text/xml";
request.BeginGetResponse(new AsyncCallback(SomeCallback), request);
...
private void SomeCallback(IAsyncResult ar) {
    HttpWebRequest request = ar.AsyncState as HttpWebRequest;
    HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;
    StreamReader reader = new StreamReader(response.GetResponseStream());
    XElement xmlResult = XElement.Parse(reader.ReadToEnd());
    ...
}

例外は次のとおりです。

System.Net.ProtocolViolationException was unhandled
Message=ProtocolViolationException
  StackTrace:
       at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()
       at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)
       at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)
       at ChargifyWPA.MainPage.button1_Click(Object sender, RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

何かアイデアがある人はいますか?httpではなくhttpsです。それが問題の原因ですか?ありがとう。

役に立ちましたか?

解決

私は、あなたが「ContentTypeを」ヘッダを設定することが、あなたのリクエストでコンテンツを提供していないので、この問題はある賭けます。リクエストを作成しようとしているときに、プロトコルの例外がスローされます。

あなたはおそらく平均「text / xmlで」ではなく、コンテンツタイプヘッダーに「受け入れる]ヘッダを設定します。

他のヒント

これはあなたの問題ではありませんが、それは他の誰かを助けるかもしれません。私がGET要求にBeginGetRequestStream()を呼んでいたので、私はこれに走りました。もちろん、それは必要はありませんし、私はちょうどBeginGetResponse()を呼び出すされている必要があります。愚かなミスが、エラーメッセージがより有用されていた場合、私はたくさんより速くそれを考え出しただろう。

存在する場合、「GET」と

「のContent-Type」ヘッダは、要求に例外が発生します GETのヘッダの「ContentTypeを」

に空の文字列を使用する - けれどもAzureテーブルREST APIではそれが認証ヘッダにエンコードContentTypeをするために必要です

最近デスクトップでこのエラーが発生する最も一般的な原因は、TLS 認証ではなく SSL を必要とする Web サーバーであるようです。すべてのコメントを見る この記事では、さまざまな .NET 2 HTTP エラーのトラブルシューティング オプションについて説明しています. 。CodePlex 上の MIT ライセンスの Chargify.NET プロジェクトはすでに この回避策を使用すると (「セキュリティプロトコルタイプ.Ssl3」)。

試してみるその他のオプション 2008年頃の別の記事 HTTP/1.0 にフォールバックするか、キープアライブを無効にします。

ぜひお試しください この答え, 、ContentType の初期化を削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top