2016-06-10 5 views
1

Ich führe eine Jquery Ajax Anfrage. Das Ziel ist ein Aschx-Handler. Das Problem ist, dass im Back-End eine zweite asynchrone Anfrage aufgerufen wird. Aufgrund dieser Tatsache werde ich in den "Fehler" -Fall der jquery ajax-Anfrage fallen (Fehler: "Ein asynchrones Modul oder eine asynchrone Prozedur, die ausgeführt wurde, während ein asynchroner Vorgang noch ausstehend war").Ajax Anfrage mit Async C# Servicehandler

Hier ist der Code:

Ajax-Aufruf:

 $.ajax({ 
       type: "POST", 
       cache: false, 
       url: 'ajax/HandlerAsync.ashx', 
       contentType: 'application/json; charset=utf-8', 
       dataType: 'json', 
       data: '{method: "'+ data.value +'" , meeting: '+ meeting +' }', 
       success: function (data, status, xhr) { 

       }, 
       error: function (xhr, status, error) { 

       } 
      }); 

Backend:

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) 
    { 
     httpContext = context; 

     string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 
     dynamic test = JsonConvert.DeserializeObject(json); 
     AjaxRequest ajax = JsonConvert.DeserializeObject<AjaxRequest>(json); 

     Async async = new Async(cb, extraData); 
     // store a little context for us to use later as well 
     async.context = context; 

     if (String.IsNullOrEmpty(ajax.meeting.EventId)) 
     { 
      var calendarEntryId = sendCalendarInvitations((ajax.meeting)); 
     } 
     else 
     { 
      updateCalendarInvitations(ajax.meeting); 
     } 
     async.SetCompleted(); 

     return async; 
    } 


    public void EndProcessRequest(IAsyncResult result) 
    { 
     // Finish things 
     Async async = result as Async; 
     async.context.Response.Write("<H1>This is an <i>Asynchronous</i> response!!</H1>"); 
    } 

Das Problem bei dem folgenden Verfahren auftritt, die in der Sende/updatecalendarinvitation auf var aufgerufen wird dcr = erwarten discClient.DiscoverCapabilityAsync (Fähigkeit); Dadurch wird der "EndProcessRequest" aufgerufen, leider zu früh. Ich will es nur aufgerufen werden, wenn die calendarinvitations gemacht ...

AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", WebConfigurationManager.AppSettings["AuthorizationUri"], SettingsHelper.TenantId)); 
      DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri, 
        async() => 
        { 

         var authResult = await authContext.AcquireTokenByRefreshTokenAsync(this.refreshToken, 
         new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey), 
         SettingsHelper.DiscoveryServiceResourceId); 
         return authResult.AccessToken; 
        }); 

      var dcr = await discClient.DiscoverCapabilityAsync(capability); 

      OutlookServicesClient exClient = new OutlookServicesClient(dcr.ServiceEndpointUri, 
      async() => 
      { 
       var authResult = await authContext.AcquireTokenByRefreshTokenAsync(this.refreshToken, 
        new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey), 
        dcr.ServiceResourceId); 
       return authResult.AccessToken; 
      }); 
      return exClient; 

Der Backend-Code funktioniert gut, werden die Verfahren alle aufgerufen werden. Aber ich will nur das richtige Feedback. Ich suche forwand für Ihr Feedback. Danke!

+0

Es ist schwer, aus dem entsandten Code zu sagen, aber es sieht aus wie die verschiedenen „Client“ Klassen möglicherweise 'Action' Rückrufe einnehmen. In diesem Fall werden die Async-Lambdas zu async void, was den angezeigten Fehler verursachen kann. –

Antwort

2

Ok gelöst. Ich habe den Kontext (letzter Codeabschnitt von oben) in eine separate Aufgabe eingepackt, die nicht die "EndprocessRequest" auslöst.

var client = System.Threading.Tasks.Task.Run<OutlookServicesClient>(() => { 
      return o365Api.CreateOutlookClientAsync("Calendar"); 
     });