[英]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秒执行时,我什至无法在浏览器中完全执行该方法之前切换页面...我试图将ConcurrencyMode
为Multiple
或Reentrant
,我尝试不使用同步上下文,并且试图将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.