2017-02-22 149 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."); 
    } 

此代碼適用於單個調用。

然後我寫了一些測試代碼在控制檯長期計劃模擬有很多請求擊中API,下面的代碼:

 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

其實自己找到了解決方案。這完全是關於具有100秒的默認超時值的HttpClient。

因此,當有大量的併發請求命中API時,其中一些會立即執行,其中一些需要等待免費資源。如果這些請求等待時間過長,比httpclient超時時間長,則會發生錯誤。

因此,將超時值增加到了所需的值,現在所有的工作都很完美。

實施例:

var client = new HttpClient(); 
client.Timeout = TimeSpan.FromMinutes(5);