Асинхронный вызов службы отдыха WCF с доступом к переменным сеанса - PullRequest
0 голосов
/ 02 апреля 2012

Я создал службу отдыха WCF, а затем вызвал ее из javascript, используя ajax.Теперь я хочу, чтобы этот сервис выполнялся асинхронно, но он также должен иметь доступ к переменным сеанса.

 [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, и асинхронный вызов службы должен продолжать выполняться в фоновом режиме.Но в приведенном выше случае ожидание полного выполнения службы (т.е. синхронного выполнения) и последующего перенаправления на secondpage.aspx.Дайте мне знать, если есть другие способы реализовать это.

1 Ответ

0 голосов
/ 02 апреля 2012

Вы можете просто вернуть логическое значение из вашего сервиса. Прежде чем возвращать логический ответ, просто запустите новый поток и выполните фоновую работу.

...