HttpwebRequest - HRESULT 异常:0x800710DD
HttpwebRequest - Exception from HRESULT: 0x800710DD
我试图向服务器发送一个 cookie。但是当它这样做时,它会抛出一个我无法追踪的奇怪异常:
Message "The operation identifier is not valid. (Exception from HRESULT: 0x800710DD)" string
StackTrace " at Windows.Web.Http.Filters.HttpBaseProtocolFilter.SendRequestAsync(HttpRequestMessage request)\r\n at System.Net.Http.HttpHandlerToFilter.<SendAsync>d__1.MoveNext()" string
抛出异常的行:
Request.BeginGetResponse( new AsyncCallback( GetResponseCallback ) , Request );
一开始我从没想过这是 cookie 的问题,直到我注释掉这一行:
WCRequest.CookieContainer = WBackgroundTransfer.Cookies;
如果上面的行被注释掉,异常就消失了。所以我尝试了另一种方法:
CookieContainer CC = new CookieContainer();
CC.Add( new Cookie( "aa", "bb" ) );
WCRequest.CookieContainer = CC;
上面一行没有抛出任何异常。然后我继续修改我的代码:
CookieContainer CC = new CookieContainer();
foreach( Cookie C in WBackgroundTransfer.Cookies.GetCookies( ReqURI ) )
{
CC.Add( new Cookie( C.Name, C.Value, C.Path, C.Domain ) );
}
WCRequest.CookieContainer = CC;
异常又回来了!
然后我再次尝试修改代码:
WCRequest.Headers[ HttpRequestHeader.Cookie ] = WBackgroundTransfer.Cookies.GetCookieHeader( ReqUri );
异常仍然存在。我修改代码为:
WCRequest.Headers[ HttpRequestHeader.Cookie ] = "ab=cd";
这有效!
所以我认为某些 cookie 导致了这个问题。我继续比较服务器响应。
我发送到服务器的确切 cookie 是:
PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v
当我将上面的 cookie 发送到服务器时,响应是:
HTTP/1.1 200 OK
Date: Fri, 06 Nov 2015 16:51:13 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=dd4e3badd19f3f67e86fe1431b7fe895a1446828673; expires=Sat, 05-Nov-16 16:51:13 GMT; path=/; domain=.example.com; HttpOnly
Set-Cookie: PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v; path=/; HttpOnly
Vary: Accept-Encoding
Server: nginx
CF-RAY: 24124d464d493439-HKG
当我发送一个随机的、不相关的 cookie,或者不给服务器任何 cookie 时:
HTTP/1.1 200 OK
Date: Fri, 06 Nov 2015 16:53:24 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d0a29df98a2984c4f5c4b2ddbc900fde01446828804; expires=Sat, 05-Nov-16 16:53:24 GMT; path=/; domain=.example.com; HttpOnly
Vary: Accept-Encoding
Server: nginx
CF-RAY: 2412507ad4c6330d-HKG
这两个请求的唯一区别是这一行:
Set-Cookie: PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v; path=/; HttpOnly
这告诉我在我发送给它的地方设置 cookie。
这很令人沮丧。这是 API 错误吗?或者我错过了什么?我无法修改服务器行为,所以我不能 100% 确定这就是原因。
有什么想法吗?
更新:这只发生在 x64 平台上!我开始想也许这是一个 heisengbug...
Update2:不,这发生在所有平台上。我只是没有彻底测试它:(
更新3:这是无望的。我将尝试切换到套接字以查看是否有帮助
如果有人遇到这个问题。对我来说,通过清除项目中生成的库神奇地解决了这个问题。即删除以下目录:
obj/*
bin/*
Debug/*
ARM/*
Release/*
x64/*
更新 1:我刚刚注意到 HttpWebRequest 正在内部设置 Cookies 并自动发送它们。它应该这样做吗?
你检查过这个解决方案了吗:
您可以删除不需要的额外 cookie。
HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
HttpCookieManager cookieManager = filter.CookieManager;
foreach (HttpCookie cookie in cookieManager.GetCookies(uri))
{
cookieManager.DeleteCookie();
}
我试图向服务器发送一个 cookie。但是当它这样做时,它会抛出一个我无法追踪的奇怪异常:
Message "The operation identifier is not valid. (Exception from HRESULT: 0x800710DD)" string
StackTrace " at Windows.Web.Http.Filters.HttpBaseProtocolFilter.SendRequestAsync(HttpRequestMessage request)\r\n at System.Net.Http.HttpHandlerToFilter.<SendAsync>d__1.MoveNext()" string
抛出异常的行:
Request.BeginGetResponse( new AsyncCallback( GetResponseCallback ) , Request );
一开始我从没想过这是 cookie 的问题,直到我注释掉这一行:
WCRequest.CookieContainer = WBackgroundTransfer.Cookies;
如果上面的行被注释掉,异常就消失了。所以我尝试了另一种方法:
CookieContainer CC = new CookieContainer();
CC.Add( new Cookie( "aa", "bb" ) );
WCRequest.CookieContainer = CC;
上面一行没有抛出任何异常。然后我继续修改我的代码:
CookieContainer CC = new CookieContainer();
foreach( Cookie C in WBackgroundTransfer.Cookies.GetCookies( ReqURI ) )
{
CC.Add( new Cookie( C.Name, C.Value, C.Path, C.Domain ) );
}
WCRequest.CookieContainer = CC;
异常又回来了!
然后我再次尝试修改代码:
WCRequest.Headers[ HttpRequestHeader.Cookie ] = WBackgroundTransfer.Cookies.GetCookieHeader( ReqUri );
异常仍然存在。我修改代码为:
WCRequest.Headers[ HttpRequestHeader.Cookie ] = "ab=cd";
这有效!
所以我认为某些 cookie 导致了这个问题。我继续比较服务器响应。
我发送到服务器的确切 cookie 是:
PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v
当我将上面的 cookie 发送到服务器时,响应是:
HTTP/1.1 200 OK
Date: Fri, 06 Nov 2015 16:51:13 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=dd4e3badd19f3f67e86fe1431b7fe895a1446828673; expires=Sat, 05-Nov-16 16:51:13 GMT; path=/; domain=.example.com; HttpOnly
Set-Cookie: PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v; path=/; HttpOnly
Vary: Accept-Encoding
Server: nginx
CF-RAY: 24124d464d493439-HKG
当我发送一个随机的、不相关的 cookie,或者不给服务器任何 cookie 时:
HTTP/1.1 200 OK
Date: Fri, 06 Nov 2015 16:53:24 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d0a29df98a2984c4f5c4b2ddbc900fde01446828804; expires=Sat, 05-Nov-16 16:53:24 GMT; path=/; domain=.example.com; HttpOnly
Vary: Accept-Encoding
Server: nginx
CF-RAY: 2412507ad4c6330d-HKG
这两个请求的唯一区别是这一行:
Set-Cookie: PHPSESSID=j0g94fgvum0flhlop5868gjkklc5bh1v; path=/; HttpOnly
这告诉我在我发送给它的地方设置 cookie。
这很令人沮丧。这是 API 错误吗?或者我错过了什么?我无法修改服务器行为,所以我不能 100% 确定这就是原因。
有什么想法吗?
更新:这只发生在 x64 平台上!我开始想也许这是一个 heisengbug...
Update2:不,这发生在所有平台上。我只是没有彻底测试它:(
更新3:这是无望的。我将尝试切换到套接字以查看是否有帮助
如果有人遇到这个问题。对我来说,通过清除项目中生成的库神奇地解决了这个问题。即删除以下目录:
obj/*
bin/*
Debug/*
ARM/*
Release/*
x64/*
更新 1:我刚刚注意到 HttpWebRequest 正在内部设置 Cookies 并自动发送它们。它应该这样做吗?
你检查过这个解决方案了吗:
您可以删除不需要的额外 cookie。
HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
HttpCookieManager cookieManager = filter.CookieManager;
foreach (HttpCookie cookie in cookieManager.GetCookies(uri))
{
cookieManager.DeleteCookie();
}