Azure Webjobs 超时,未收到来自 webapi 的响应
Azure Webjobs timing out, not receiving response from webapi
我有一个访问 WebApi 的 Azure Webjob。 WebApi 在 4 - 5 分钟内发回确认。因此,我已宣布 HttpClient 的超时为 10 分钟。
现在,如果 WebApi 在不到 4 分钟内返回响应,它就可以正常工作。但是,如果 WebApi 在 4 分 30 秒内返回请求的响应,则 azure webjob 不会收到此确认。相反,WebJob 上的 HttpClient 正在等待 10 分钟,然后超时。我错过了 Webjob 上的某种超时吗?
如果您在 BrokeredMessages 的上下文中执行较长的 运行ning 任务或函数,它们的超时硬编码为 5 分钟。
利用 Task
我将我的长 运行ning 函数放在一个函数中并将其传递给此函数以 运行 和 "relock" BrokeredMessage:
/// <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 ) { }
}
示例用法:
var task = Task.Run( async () => { await m_service.doWork(); } );
WaitAndRelockMessage(task, message);
没有发送回任何数据的请求有 230 秒的超时。请在以下线程中查看@David Ebbo 的回答。
没有发送回任何数据的请求有 230 秒(即不到 4 分钟)的超时。在那之后,客户端得到你看到的 500,即使实际上允许请求继续服务器端。
所以没有收到Web响应的问题API与Azure Web App的超时限制有关。我也在我这边测试。尽管我在 web.config 中将 executionTimeout 设置为 10 分钟。
<httpRuntime targetFramework="4.6" executionTimeout="600" />
如果服务端发送响应的时间需要超过230s。我的客户端会出现 500 错误。
public IEnumerable<string> Get()
{
Thread.Sleep(270000);
return new string[] { "value1", "value2" };
}
我建议你接受@Thomas的建议。从您的 Web 将您的响应写入队列 API 并从队列中获取您需要的响应。
So, is there no method to bypass this timeout?
230 秒的限制也可以在下面的文章中证明。
一般空闲请求超时会导致客户端在 230 秒后断开连接。
https://github.com/projectkudu/kudu/wiki/Configurable-settings
我还没有找到任何方法来修改 Azure Web 应用程序的超时。请尝试我上面提到的解决方法。
我有一个访问 WebApi 的 Azure Webjob。 WebApi 在 4 - 5 分钟内发回确认。因此,我已宣布 HttpClient 的超时为 10 分钟。
现在,如果 WebApi 在不到 4 分钟内返回响应,它就可以正常工作。但是,如果 WebApi 在 4 分 30 秒内返回请求的响应,则 azure webjob 不会收到此确认。相反,WebJob 上的 HttpClient 正在等待 10 分钟,然后超时。我错过了 Webjob 上的某种超时吗?
如果您在 BrokeredMessages 的上下文中执行较长的 运行ning 任务或函数,它们的超时硬编码为 5 分钟。
利用 Task
我将我的长 运行ning 函数放在一个函数中并将其传递给此函数以 运行 和 "relock" BrokeredMessage:
/// <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 ) { }
}
示例用法:
var task = Task.Run( async () => { await m_service.doWork(); } );
WaitAndRelockMessage(task, message);
没有发送回任何数据的请求有 230 秒的超时。请在以下线程中查看@David Ebbo 的回答。
没有发送回任何数据的请求有 230 秒(即不到 4 分钟)的超时。在那之后,客户端得到你看到的 500,即使实际上允许请求继续服务器端。
所以没有收到Web响应的问题API与Azure Web App的超时限制有关。我也在我这边测试。尽管我在 web.config 中将 executionTimeout 设置为 10 分钟。
<httpRuntime targetFramework="4.6" executionTimeout="600" />
如果服务端发送响应的时间需要超过230s。我的客户端会出现 500 错误。
public IEnumerable<string> Get()
{
Thread.Sleep(270000);
return new string[] { "value1", "value2" };
}
我建议你接受@Thomas的建议。从您的 Web 将您的响应写入队列 API 并从队列中获取您需要的响应。
So, is there no method to bypass this timeout?
230 秒的限制也可以在下面的文章中证明。
一般空闲请求超时会导致客户端在 230 秒后断开连接。
https://github.com/projectkudu/kudu/wiki/Configurable-settings
我还没有找到任何方法来修改 Azure Web 应用程序的超时。请尝试我上面提到的解决方法。