我有一个奇怪的错误,我无法在自己的计算机上重现。
以下是我使用的完整代码:
public async Task LoadHeaderAndFooter()
{
//ignore any SSL errors
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
var baseAddress = new Uri(Request.Url.GetComponents(UriComponents.Scheme | UriComponents.Host, UriFormat.Unescaped));
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var oCookies = Request.Cookies;
for (var j = 0; j < oCookies.Count; j++)
{
var oCookie = oCookies.Get(j);
if (oCookie == null) continue;
var oC = new Cookie
{
Domain = baseAddress.Host,
Name = oCookie.Name,
Path = oCookie.Path,
Secure = oCookie.Secure,
Value = oCookie.Value
};
cookieContainer.Add(oC);
}
Header.Text = await client.GetStringAsync("/minside/loyalityadmin/header");
Footer.Text = await client.GetStringAsync("/minside/loyalityadmin/footer");
}
}
请求开始,然后等待超时(30 sek默认值),httpclient throw&#34;任务被取消&#34; exeption。然后,执行请求在服务器上触发。
现在,此代码在.ascx.cs文件中运行。而/ header是一个带.cshtml视图的MVC控件。两者都在同一台服务器上运行。
我怎样才能让它发挥作用?
答案 0 :(得分:1)
经过更多测试后,似乎restsharp.org在某些平台上也存在同样的问题(除了我的开发平台以外)。
原来问题是会话对象。在IIS上,无法在parallell中读取会话状态:
对于每个会话,访问ASP.NET会话状态是独占的,这意味着 如果两个不同的用户发出并发请求,则访问每个用户 同时授予单独的会话。但是,如果两个并发 请求是针对同一会话进行的(使用相同的SessionID) value),第一个请求获得对会话的独占访问权 信息。第二个请求仅在第一个请求之后执行 完了。 (如果排他性,第二次会议也可以访问 锁定信息被释放,因为第一个请求超过了 锁定超时。)如果@Page中的EnableSessionState值 指令设置为ReadOnly,即只读会话的请求 信息不会导致会话数据的独占锁定。 但是,会话数据的只读请求可能仍需要等待 对于由会话数据的读写请求设置的锁定来清除。
来自https://msdn.microsoft.com/en-us/library/ms178581.aspx
所以解决方案是简单地不传递会话ID:
if (oCookie == null || oCookie.Name == "ASP.NET_SessionId") continue;
Witch工作正常,因为辅助请求不需要访问会话。任何可以在两个请求中使用会话的解决方案都将收到谢谢。