私は現在、長時間実行される操作を行うためにSharePoint WCF Webサービスをホストしています。基本的に、この操作で情報を取得するための別のHTTP要求が行われます(この他の呼び出しには最大2分かかります)。長時間実行されているWCF呼び出しは、その後の要求をブロックします。
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秒かかる場合、メソッドが完全に実行されるまでブラウザーでページを切り替えることはできません... をMultiple
またはReentrant
に配置しようとしましたが、同期コンテキストを使用しようとしませんでした。 InstanceContextMode
をPerCall
に設定しようとしましたが、何も変更されません。サーバーはまだ他の操作を処理する前に呼び出しが完了するのを待ちます...