我正在解决这个bug:
https://github.com/openstacknetsdk/openstack.net/issues/333
问题涉及到一个 ProtocolViolationException
,错误信息如下:
Chunked encoding upload is not supported on the HTTP/1.0 protocol.
我发现可以通过发送一个产生502响应代码的网络请求,再使用带分块编码的POST请求来可靠地复现该问题。我将此追溯到在502响应后,ServicePoint.HttpBehaviour
属性具有值 HttpBehaviour.HTTP10
。
我使用了以下 hack(在 catch 块中),成功解决了该问题。这段代码“隐藏”了由失败请求创建的 ServicePoint
实例,使其强制为下一个请求创建新的 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();
}
问题:
- 为什么我会观察到这种行为?
- 有没有一种非hack的方法来解决这个问题?
问题:
- 为什么我会观察到这种行为?
- 有没有一种非hack的方法来解决这个问题?