2017-08-30 2 views
0

私は現在、長時間実行される操作を行うために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に配置しようとしましたが、同期コンテキストを使用しようとしませんでした。 InstanceContextModePerCallに設定しようとしましたが、何も変更されません。サーバーはまだ他の操作を処理する前に呼び出しが完了するのを待ちます...

答えて

0

多くの調査の結果、事実、私はWCFサービスでセッションを使用していました。その場合、WCFは呼び出しを順番に処理します。つまり、呼び出しが開始されると、他のすべての呼び出し(スイッチページへの呼び出しも)は、治療した...

サービスを本当に必要とするかどうかを問わなければなりません。実際には、は、セッションでと書く必要があります。私が知っている限り、それを修正することはありません。しかし、あなたのサービスはちょうどする必要がある場合は、あなたはこれであなたのGlobal.asaxファイルを上書きすることができ、あなたのセッションからの情報をお読みください。

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

これは、WCFは、読み取り専用モードにし、その場合には、セッションを使用していることを保証し、コールを並行して処理することができます。

関連する問題