このバグの解決に取り組んでいます:
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();
}
質問:
- なぜ私はこの行動を観察しているのですか?
- 問題を解決するための非ハッキーな方法は何ですか?