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!
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. –