WEBAPI停止响应请求
问题描述:
我写了一个简单的测试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的某些设置?
如果您有任何问题,请让我知道。谢谢。
答
其实自己找到了解决方案。这完全是关于具有100秒的默认超时值的HttpClient。
因此,当有大量的并发请求命中API时,其中一些会立即执行,其中一些需要等待免费资源。如果这些请求等待时间过长,比httpclient超时时间长,则会发生错误。
因此,将超时值增加到了所需的值,现在所有的工作都很完美。
实施例:
var client = new HttpClient();
client.Timeout = TimeSpan.FromMinutes(5);