2017-02-22 23 views
0

Я написал простой тестовый WEB API для преобразования файлов docx в pdf (с использованием сторонней библиотеки). Код, как указано ниже:WEBAPI останавливает ответ на запрос

[Route("PDFConvert/Convert")] 
    [HttpPost] 
    public IHttpActionResult ConvertFile(string name) 
    { 
     var content = Request.Content.ReadAsStreamAsync().Result; 
     try 
     { 
      if (content != null) 
      { 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        content.CopyTo(ms); 

        Converter.Convert(ms.ToArray(), @".docx", @"c:\pdftest\" + name + @".pdf"); 
       } 
      } 
      else 
      { 
       return Content(HttpStatusCode.InternalServerError, "No source file supplied.");      
      } 
     } 
     catch (Exception ex) 
     { 
      return InternalServerError(new Exception(ex.Message)); 
     } 

     return Ok("File " + name + ".docx has been converted."); 
    } 

Этот код работает для одного вызова.

Затем я написал несколько тестирований коды в консоли програме для имитации есть много запросов Поразите апи, коды ниже:

 for (int i = 1; i < 101; i++) 
     { 

      var filestream = File.OpenRead(@"c:\pdftest\" + i.ToString() + @".docx"); 
      test(filestream, i.ToString()); 
     } 

    static void test(FileStream fs, string id) 
    { 
     var content = new StreamContent(fs); 
     var client = new HttpClient(); 

     //post to web api 
     var response = client.PostAsync("http://localhost/WebAPI.PDFConvertion/PDFConvert/Convert?name=" + id, content); 


     Console.WriteLine("File Name: " + id + ".pdf"); 
     client.Dispose(); 
    } 

Этого WEB API размещались в IIS 7.5 со всеми настройками по умолчанию.

Теперь возникает проблема: после преобразования некоторых файлов (весь исходный файл docx совпадает с другим именем файла) весь процесс останавливается.

В моем тесте, если размер происхождение файлов большие (> 1M), он всегда останавливается после преобразования 37 файлов, и если файлы происхождение размера малы (например, 20KB), он всегда останавливается после 69.

Если я не использую API и не переношу код конвертации в консоль для тестирования, все хорошо, все 100 файлов преобразуются один за другим.

В реальном сценарии необходимо преобразовать тысячи файлов docx, и мы планируем сделать запрос к API для каждого файла, что означает, что тысячи запросов за короткий период.

Итак, не могли бы вы дать понять, как решить эту проблему? Нужно ли мне изменять некоторые параметры IIS?

Пожалуйста, дайте мне знать, если у вас есть вопросы. Благодарю.

ответ

0

Фактически нашел решение самостоятельно. Это все о HttpClient, который имеет значение тайм-аута по умолчанию 100 секунд.

Поэтому, когда в API появляется много одновременных запросов, некоторые из них будут выполняться немедленно, некоторые из них должны ждать свободных ресурсов. Если эти запросы ждут слишком долго, например, дольше, чем время таймаут httpclient, возникает ошибка.

Так увеличено значение тайм-аута до значения, которое необходимо и все работает отлично сейчас.

Пример:

var client = new HttpClient(); 
client.Timeout = TimeSpan.FromMinutes(5); 
Смежные вопросы