繁体   English   中英

长时间运行的WCF调用会阻止任何后续请求

[英]Long running WCF calls blocks any subsequent request

我目前正在托管SharePoint WCF Web服务,以进行长期运行。 基本上,此操作将发出另一个HTTP请求以检索信息(此另一个调用最多可能需要2分钟)。 该服务的代码如下(我剥离了一些代码行):

public async Task<Stream> Get()
{
    WebOperationContext operationContext = WebOperationContext.Current;

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.Timeout = TimeSpan.FromMinutes(5);

        HttpResponseMessage response = await client.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            string result = await response.Content.ReadAsStringAsync();

            operationContext.OutgoingResponse.ContentType = "application/json";

            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        else
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = response.StatusCode;
        }
    }

    return null;
}

我从AngularJS应用程序通过AJAX调用了该Web服务,问题是它阻止了所有后续调用,甚至是“正常”调用。 例如,当GetAsync方法需要90秒执行时,我什至无法在浏览器中完全执行该方法之前切换页面...我试图将ConcurrencyModeMultipleReentrant ,我尝试不使用同步上下文,并且试图将InstanceContextMode设置为PerCall但是它没有任何改变,服务器仍然等待呼叫完成,然后再处理其他操作...

经过大量调查,我终于找到了问题所在。 事实是,我在WCF服务中使用了会话,在这种情况下,WCF会顺序处理呼叫,这意味着一旦开始呼叫,所有其他呼叫(甚至是切换页面的呼叫)都必须等待其完成才可以处理过...

要解决此问题,您必须问自己是否真的需要在会话中进行服务。 据我所知,如果可以,则无法修复。 但是,如果您的服务只需要从会话中读取信息,则可以使用以下方法覆盖global.asax文件:

if (Request.Path.Contains("myservice.svc"))
{
     HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
}

这样可以确保WCF以只读模式使用会话,在这种情况下,可以并行处理呼叫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM