Httpclient在服务器开始处理请求之前获取超时

时间:2018-05-07 09:58:31

标签: c# dotnet-httpclient

我有一个奇怪的错误,我无法在自己的计算机上重现。

以下是我使用的完整代码:

 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控件。两者都在同一台服务器上运行。

我怎样才能让它发挥作用?

1 个答案:

答案 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工作正常,因为辅助请求不需要访问会话。任何可以在两个请求中使用会话的解决方案都将收到谢谢。