10

このバグの解決に取り組んでいます:
https://github.com/openstacknetsdk/openstack.net/issues/333

この問題にはProtocolViolationException、次のメッセージが含まれます。

チャンク エンコーディングのアップロードは、HTTP/1.0 プロトコルではサポートされていません。

502 レスポンス コードを生成する Web リクエストを作成した後、チャンク エンコーディングで POST リクエストを使用する呼び出しを行うことで、問題を確実に再現できることがわかりました。これは、502 応答に続くServicePoint.HttpBehaviour値を持つプロパティにまでさかのぼります。HttpBehaviour.HTTP10

次のハック(catchブロック内)を使用して問題を解決できました。ServicePointこのコードは、失敗したリクエストによって作成されたインスタンスを から「隠し」、次のリクエストのためにServicePointManager新しいインスタンスを強制的に作成します。ServicePoint

public void TestProtocolViolation()
{
    try
    {
        TestTempUrlWithSpecialCharactersInObjectName();
    }
    catch (WebException ex)
    {
        ServicePoint servicePoint = ServicePointManager.FindServicePoint(ex.Response.ResponseUri);
        FieldInfo table = typeof(ServicePointManager).GetField("s_ServicePointTable", BindingFlags.Static | BindingFlags.NonPublic);
        WeakReference weakReference = (WeakReference)((Hashtable)table.GetValue(null))[servicePoint.Address.GetLeftPart(UriPartial.Authority)];
        if (weakReference != null)
            weakReference.Target = null;
    }

    TestTempUrlExpired();
}

質問:

  1. なぜ私はこの行動を観察しているのですか?
  2. 問題を解決するための非ハッキーな方法は何ですか?
4

1 に答える 1