2012-04-02 16 views
0

私はWCFレストサービスを作成し、それをajaxを使ってjavascriptから呼び出しました。今私はこのサービスを非同期に実行したいが、セッション変数にもアクセスする必要があります。セッション変数を使用したWCFレストサービスへの非同期呼び出し

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/DoWork")] 
    void DoWork(); 

} 

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service : IService 
{ 
    public void DoWork() 
    { 

     System.Threading.Thread.Sleep(15000); // Making some DB calls which take long time. 
     try 
     { 

      HttpContext.Current.Session["IsCompleted"] = "True"; // Want to set a value in session to know if the async operation is completed or not. 
     } 
     catch 
     { 
     } 
    } 
} 

のWeb.Config =

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <bindings> 
     <webHttpBinding> 
     <binding name="Rest_WebBinding"> 
      <security mode="Transport"> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="Rest"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="AsyncHost.Services.ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="AsyncHost.Services.ServiceBehavior" name="AsyncHost.Services.Service"> 

     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <endpoint behaviorConfiguration="Rest" binding="webHttpBinding" contract="AsyncHost.Services.IService" /> 
     </service> 
    </services> 
    </system.serviceModel> 
    <system.web> 

私は以下のようにのようにJavaScriptからこのサービスを消費し、ここで

$.ajax({ 
       type: "POST", 
       async: true, 
       contentType: "application/json", 
       url: 'http://localhost:34468/Services/Service.svc/DoWork', 
       data: null, 
       cache: false, 
       processData: false, 
       error: function() { 
        alert('Error'); 
       } 
      }); 

    setTimeout("window.location.href = 'SecondPage.aspx';", 200); 

が、私はこのサービスの応答を心配していないですが、それは更新する必要があります私はサービスの実装でコメントしたので、完了後にセッション変数。

このサービスを呼び出した後、secondpage.aspxにリダイレクトされて、非同期サービスコールがバックグラウンドで実行され続ける必要があります。 しかし、上記の場合、サービスの完全な実行(つまり同期実行)を待ってから、第2のページ.aspxにリダイレクトします。 これを実装する他の方法があるかどうかを教えてください。

答えて

0

サービスからブール値を返すことができます。ブール型応答を返す前に、新しいスレッドを開始してバックグラウンドジョブを実行してください。

+0

ここに重要な注意** **あなたのサービスがiisでホストされている場合は、新しいスレッドを開始しないでください。この動作が最近変更されていない限り、iisスレッド内のキャッチされない例外によってw3wp.exeプロセスがシャットダウンし、Webサイト全体がクラッシュします。 バックグラウンド作業をしたい場合は、WCFサービスをWindowsサービスとしてホストすることをお勧めします。 –

+0

ok ..ありがとうございます。 –

関連する問題