HttpWebRequest を使用しようとすると ProtocolViolationException が発生するのはなぜですか?
-
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()を呼び出すされている必要があります。愚かなミスが、エラーメッセージがより有用されていた場合、私はたくさんより速くそれを考え出しただろう。
「のContent-Type」ヘッダは、要求に例外が発生します GETのヘッダの「ContentTypeを」
に空の文字列を使用する - けれどもAzureテーブルREST APIではそれが認証ヘッダにエンコードContentTypeをするために必要です最近デスクトップでこのエラーが発生する最も一般的な原因は、TLS 認証ではなく SSL を必要とする Web サーバーであるようです。すべてのコメントを見る この記事では、さまざまな .NET 2 HTTP エラーのトラブルシューティング オプションについて説明しています. 。CodePlex 上の MIT ライセンスの Chargify.NET プロジェクトはすでに この回避策を使用すると (「セキュリティプロトコルタイプ.Ssl3」)。
試してみるその他のオプション 2008年頃の別の記事 HTTP/1.0 にフォールバックするか、キープアライブを無効にします。
ぜひお試しください この答え, 、ContentType の初期化を削除します。