2017-02-22 180 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);