Я написал асинхронный HttpModule
, который регистрирует весь запрос, поступающий на веб-сайт. Когда запрос поступает на веб-сайт, пользовательский модуль http вызывает WebAPI для записи информации в базу данных. .Net 4.5/Visual studio с IIS Express.HttpModule - Асинхронный не работает
////////////Custom HTTP module////////////////////
public class MyHttpLogger : IHttpModule
{
public void Init(HttpApplication httpApplication)
{
EventHandlerTaskAsyncHelper taskAsyncHelper = new EventHandlerTaskAsyncHelper(LogMessage);
httpApplication.AddOnBeginRequestAsync(taskAsyncHelper.BeginEventHandler, taskAsyncHelper.EndEventHandler);
}
private async Task LogMessage(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var ctx = app.Context;
//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
UseDefaultCredentials = true
};
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://localhost:58836/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var actvity = new Activities() { AppId = "TEST123", ActivityId = 10, CreatedBy = 1 };
await client.PostAsJsonAsync("api/activity", actvity);
}
}
Упрощенный код WebAPI для "api/activity".
public async Task<HttpResponseMessage>Post(Activities activity)
{
await Task.Delay(30000);
// Database logging code goes here….
return new HttpResponseMessage(HttpStatusCode.Created);
}
Вопрос: когда PostAsJsonAsync
становится выполнен код останавливается. Это правильно, так как код должен ждать. Но процедура вызова не будет продолжена асинхронно, как ожидалось, и ответ веб-сайта медленнее на 30 секунд.
Что не так с этим кодом? Приобретение асинхронного HttpModule
не должно мешать потоку приложения Http? В настоящее время, когда я посещаю сайт, код блокируется.
Вы имеете в виду браузер, застрявший там в течение 30 секунд? это очевидно, потому что браузер еще не получил ответа – Steve
@Steve, Да. Браузер застрял в течение 30 секунд. Как этого избежать? что не так с этим кодом Async? –
@ ЭрикСмит: В этом нет ничего плохого. Вы просили отложить запрос на 30 секунд, и вот что произошло. –