1

I execute an jquery ajax request. The destination is a ashx handler. The problem is that on the backend a second async request is called. Due of this fact, I'll fall in the "error" case of the jquery ajax request (Error: "An asynchronous module or handler completed while an asynchronous operation was still pending").

Here the code:

Ajax call:

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

The problem occurs at the following method, which will be called in the send/updatecalendarinvitation on var dcr = await discClient.DiscoverCapabilityAsync(capability); By executing this, the "EndProcessRequest" will be called, unfortunately too soon. I just want it to be called, when the calendarinvitations are made...

 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;

The backend code works fine, the methods will all be called. But I just want the right feedback. I looking forwand for your feedback. Thanks!

1
  • It's hard to tell from the posted code, but it looks like the various "client" classes are possibly taking Action callbacks. In this case, the async lambdas will become async void, which can cause the error you're seeing. Commented Jun 10, 2016 at 15:53

1 Answer 1

2

Ok solved. I wrapped the context (last code section from above) in a seperate Task, which don't fire the "EndprocessRequest".

 var client = System.Threading.Tasks.Task.Run<OutlookServicesClient>(() => {
            return o365Api.CreateOutlookClientAsync("Calendar");
        });
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.