我需要一些帮助来弄清楚为什么continueWith块中的以下代码没有被执行用于长时间运行的服务调用。
public static async void postServiceAsync(string json, string postServiceUrl, string callbackUrl, string clientId,
string tenant, string secret, string d365Environment, TraceWriter log)
{
HttpClient client = new HttpClient();
//Get authorization header
string authHeader = await D365Authorization.getAccessToken(clientId, tenant, secret, d365Environment);
client.DefaultRequestHeaders.Add("Authorization", authHeader);
var httpContent = new StringContent(json);
client.Timeout = TimeSpan.FromMinutes(90);
client.PostAsync(postServiceUrl, httpContent).ContinueWith(async (result) =>
{
//call callback URL
//This is not executed after a long running service that runs for 20 minutes.
}
}
如果服务执行时间很短,则continueWith代码会运行。我认为这是一个超时问题所以我添加了client.Timeout值。我尝试在Postman中调用该服务,即使在等待20分钟以上也会返回一个值。我没有使用await,因为我希望在调用PostAsync后继续执行。我只想在长时间运行的服务执行完成后执行continueWith回调。谢谢你的帮助!
名为postServiceAsync的上述方法是从Azure功能调用的,该功能是从Azure Logic App http webhook操作调用的。这是Azure功能:
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
...
PostServiceAsync.postServiceAsync(json, shipServiceUrl, callbackUrl, clientId, tenant, secret, d365Environment, log);
var resp = req.CreateResponse(HttpStatusCode.Accepted);
return resp;
}
}
从Azure功能,我需要立即返回Accepted状态代码。在使用PostAsync调用长时间运行的服务之后,我需要发布回调URL,这是我在continueWith块中所做的。就像我提到的,如果服务运行时很短,它就可以工作。我尝试了Camilo建议添加await但是continueWith代码没有被执行。我也尝试摆脱continueWith并在“await client.PostAsync(...)”之后添加了代码。
事实证明,没有响应的http调用有一个Azure函数230秒超时。我可能无法将Azure功能用于我的目的。