2012-04-02 11 views
0

Ich erstellte einen WCF Rest Service, dann rief das von JavaScript mit Ajax. Jetzt möchte ich, dass dieser Dienst asynchron ausgeführt wird, aber auch Zugriff auf Sitzungsvariablen haben soll.Async-Aufruf an WCF Rest Service mit Sitzungsvariablen Zugriff

[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> 

ich verbraucht, diesen Service von Javascript, wie wie unten,

$.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); 

Hier bin ich nicht besorgt über die Reaktion dieses Dienstes, aber es sollte aktualisieren Sitzungsvariable nach ihrem Abschluss, wie ich in der Service-Implementierung kommentiert habe.

Nach dem Aufruf dieses Dienstes möchte ich es auf secondpage.aspx umgeleitet werden und der async-Service-Aufruf sollte weiterhin im Hintergrund ausgeführt werden. Aber im obigen Fall wartet es auf die vollständige Ausführung des Dienstes (d. H. Die synchrone Ausführung) und leitet dann zur zweiten Seite.aspx um. Lassen Sie mich wissen, ob es andere Möglichkeiten gibt, dies zu implementieren.

Antwort

0

Sie können einfach einen booleschen Wert von Ihrem Dienst zurückgeben. Bevor Sie die boolesche Antwort zurückgeben, starten Sie einfach einen neuen Thread und führen den Hintergrundjob aus.

+0

ein wichtiger Hinweis hier ** nicht ** einen neuen Thread starten, wenn Ihr Dienst auf IIS gehostet wird. Wenn sich dieses Verhalten nicht in letzter Zeit geändert hat, führt eine nicht abgefangene Ausnahme in einem iis-Thread dazu, dass der Prozess "w3wp.exe" heruntergefahren wird und die gesamte Website abstürzt. Wenn Sie Hintergrundarbeit tun möchten, empfehle ich Hosting Ihres WCF-Dienstes als Windows-Dienst –

+0

ok .. Danke. –