2014-11-05 1 views
0

Я написал асинхронный 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? В настоящее время, когда я посещаю сайт, код блокируется.

+0

Вы имеете в виду браузер, застрявший там в течение 30 секунд? это очевидно, потому что браузер еще не получил ответа – Steve

+0

@Steve, Да. Браузер застрял в течение 30 секунд. Как этого избежать? что не так с этим кодом Async? –

+1

@ ЭрикСмит: В этом нет ничего плохого. Вы просили отложить запрос на 30 секунд, и вот что произошло. –

ответ

1

Теперь вы должны понимать разницу между HTTP-запросом и локальным приложением. HTTP полностью без гражданства. В основном вы отправляете запрос, сервер обрабатывает его и отправляет ответ. Сервер НЕ хранит информацию о клиенте, он не знает, кто такой клиент. Таким образом, в вашем случае браузер отправляет запрос -> сервер получил его, дождался 30 секунд для его обработки, а затем отправил обратно результат -> браузер получил ответ, и это тот момент, когда браузер показывает результат. Я предполагаю, что вы пытаетесь сделать, браузер отправляет запрос, а затем вы ожидаете, что браузер отобразит что-то, а затем через 30 секунд сервер завершит обработку и вы хотите отобразить что-то еще. Это НЕ возможно делать с ожиданием по причине, упомянутой выше. Что вы должны сделать, так это написать несколько кодов javascript для отправки запроса с помощью некоторого идентификатора, а затем спросить сервер каждые x секунд, чтобы узнать, завершилась ли задача {ID}, если да, то какой результат.

+0

Что я хочу делать? браузер должен работать так, как при посещении веб-сайта, но я хочу захватить трафик на веб-сайте с помощью Async и HTTPModules. Я вызываю Web API API Async для регистрации активности. Я просто хочу написать Async HTTP Framework для захвата трафика веб-сайта. –

+0

@ ЭрикСмит должен делать, перефразировать – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^