2016-09-29 4 views
0

У меня есть Google для этого, и мне удалось найти несколько ссылок, объясняющих концепцию запросов Async HTTP в C# и Web Api 2. Однако мне не удалось получить какие-либо рабочие примеры.Async HTTP-запрос в Web Api

Как раз для того чтобы очистить воздух, мое требование как ниже. Когда клиент вызывает API (который выполняет длительную обработку), он должен немедленно вернуть HTTP 202 (Accepted) в качестве ответа и продолжить обработку в фоновом режиме. Я до сих пор понимаю. Ниже приведен мой пример кода, как я реализовал то же самое. Где я застрял, когда эта задача длительной обработки завершена в фоновом режиме, она должна запустить обратный вызов одному клиенту и вернуться с ответом HTTP 200. Вполне возможно, что, хотя задача длительной обработки выполнялась в фоновом режиме, клиент выдал другой параллельный запрос с разными значениями.

Может ли кто-нибудь указать мне в правильном направлении. Возможно ли это только через код или какие-либо настройки будут реализованы на уровне IIS. Цените свое время и помогите в этом.

Спасибо всем заблаговременно.

Мой код до сих пор.

public HttpResponseMessage Execute(string plugin, string pluginType, string grid, string version) 
    { 
     try 
     { 
      var type = this.LoadPlugin(plugin, pluginType, version); 

      if (type != null) 
      { 
       var method = type.GetMethod("Execute"); 

       if (method != null) 
       { 
        new Task(() => 
        { 
         // This line will take long to execute. 
         var filepath = method.Invoke(Activator.CreateInstance(type), new object[1] { grid }); 

         // After this line it must invoke a callback to the client with the response as "filepath" and HTTP status code as 200 
         type = null;        
        }).Start(); 
       } 
       else 
       { 
        return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable); 
       } 
      } 
      else 
      { 
       return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable); 
      } 
     } 
     catch (Exception ex) 
     { 
      return new HttpResponseMessage(HttpStatusCode.InternalServerError); 
     } 

     return new HttpResponseMessage(HttpStatusCode.Accepted); 
    } 

    private Type LoadPlugin(string plugin, string pluginType, string version) 
    { 
     Assembly assembly; 

     Type returnValue = null; 

     var pluginFile = new DirectoryInfo(this._pluginPath).GetFiles("*.dll") 
                  .Where(file => FileVersionInfo.GetVersionInfo(file.FullName).OriginalFilename.ToUpper().Contains("TRANSFORMATION." + plugin.ToUpper())) 
                  .OrderByDescending(time => time.LastWriteTime).FirstOrDefault(); 

     if (pluginFile != null) 
     { 
      assembly = Assembly.LoadFrom(pluginFile.FullName); 

      AppDomain.CurrentDomain.Load(assembly.GetName()); 

      returnValue = assembly.GetType("Transformation.Plugins." + pluginType); 

      assembly = null; 
     } 

     return returnValue; 
    } 
+0

Вы не можете отправить несколько ответов для одного запроса, поскольку это будет нарушать стандарт HTTP. Однако вы можете написать собственный код для отправки ответа на конкретное событие. Вы также можете рассмотреть Response.Flush() - https://msdn.microsoft.com/en-us/library/system.web.httpresponse.flush(v=vs.110).aspx –

ответ

0

Я думаю, вы можете решить эту проблему, делая ваш веб-метод API асинхр:

public async Task<HttpResponseMessage> Execute(string plugin, string pluginType, string grid, string version) 
{ 
    // Your code here 
} 

Кроме того, призовите Ваша задача должна быть с AWAIT ключевое слово, что-то вроде этого:

await Task.Run(() => 
{ 
    // Yor code here 
}); 

У вас может быть несколько ожиданий внутри вашего асинхронного метода.

Сообщите мне, если этот ответ полезен.

+0

Я тоже пробовал это. Но после ожидания выполнения Task.Run() завершение выполнения, оно не возвращает ответ; потому что ответ уже отправлен еще до запуска Task.Run(). Таким образом, в принципе, должен быть метод обратного вызова, который должен быть выполнен после завершения Task.Run(). –

+0

Я использовал этот асинхронный способ с угловым приложением с множеством callls, и у меня не было проблем, как вы называете ваш api от клиента? –

+0

Мне нужно подражать вашему сценарию для предоставления решения, можете ли вы предоставить мне необходимый код для этой проблемы? –

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

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