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にリダイレクトします。 これを実装する他の方法があるかどうかを教えてください。
ここに重要な注意** **あなたのサービスがiisでホストされている場合は、新しいスレッドを開始しないでください。この動作が最近変更されていない限り、iisスレッド内のキャッチされない例外によってw3wp.exeプロセスがシャットダウンし、Webサイト全体がクラッシュします。 バックグラウンド作業をしたい場合は、WCFサービスをWindowsサービスとしてホストすることをお勧めします。 –
ok ..ありがとうございます。 –