我有一个Azure Webjob,它可以访问WebApi。 WebApi会在4到5分钟内发回确认。所以,我已经宣布HttpClient的TimeOut为10分钟。
现在,如果WebApi在不到4分钟的时间内返回响应,那么它可以正常工作。但是如果WebApi在4分30秒内返回请求的响应,则azure webjob没有收到此确认。相反,WebJob上的HttpClient正在等待10分钟,然后超时。我错过了Webjob上的某种时间吗?
答案 0 :(得分:1)
对于未发送任何数据的请求,有230秒超时。请在以下主题中查看@David Ebbo的答案。
对于未发送任何数据的请求,有230秒(即少于4分钟)超时。之后,客户端获得您看到的500,即使实际上允许请求继续服务器端。
因此,未从Web API接收响应的问题与Azure Web App的超时限制有关。我也在我身边测试它。虽然我在web.config中将executionTimeout设置为10分钟。
<httpRuntime targetFramework="4.6" executionTimeout="600" />
如果从服务端发送响应的时间需要超过230秒。我的客户端会收到500错误。
public IEnumerable<string> Get()
{
Thread.Sleep(270000);
return new string[] { "value1", "value2" };
}
我建议你接受@Thomas的建议。将响应从Web API写入队列,并从队列中获取所需的响应。
那么,有没有办法绕过这个超时?
230秒的限制也可以在下面的文章中证明。
存在一般的空闲请求超时,导致客户端在230秒后断开连接。
https://github.com/projectkudu/kudu/wiki/Configurable-settings
我还没有找到任何方法来修改Azure Web App的此超时。请尝试我上面提到的解决方法。
答案 1 :(得分:0)
如果您在BrokeredMessages的上下文中执行长时间运行的任务或函数,则它们的超时硬编码为5分钟。
利用Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
object miss = System.Reflection.Missing.Value;
object path = @"C:\Transcript.doc";
object readOnly = true;
Microsoft.Office.Interop.Word.Document docs = word.Documents.Open(ref path, ref miss, ref readOnly, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
string totaltext = "";
for (int i = 0; i < docs.Paragraphs.Count; i++)
{
totaltext += " \r\n " + docs.Paragraphs[i + 1].Range.Text.ToString();
}
Console.WriteLine(totaltext);
docs.Close();
word.Quit();
我将长时间运行的函数放在一个函数中并将其传递给此函数以运行并“重新锁定”BrokeredMessage:
Task
样本用法:
/// <summary>
/// Maximum time lockout for a BrokeredMessage is 5 minutes. This allows the
/// timer to relock every 4 minutes while waiting on Task parameter to complete.
/// </summary>
/// <param name="task"></param>
/// <param name="message"></param>
private void WaitAndRelockMessage( Task task, BrokeredMessage message )
{
var myTimer = new Timer( new TimerCallback( RelockMessage ), message, 240000, 240000 );
task.Wait();
myTimer.Dispose();
}
private void RelockMessage( object message )
{
try { ((BrokeredMessage)message).RenewLock(); }
catch( OperationCanceledException ) { }
}