Web Api中的异步HTTP请求
本文关键字:HTTP 请求 异步 Api Web | 更新日期: 2023-09-27 18:09:15
我在谷歌上搜索了一下,找到了几个解释c#和Web Api 2中异步HTTP请求概念的链接。然而,我没有得到任何相同的工作示例。
为了消除误会,我的要求如下。当客户端调用API(执行长时间运行的处理)时,它必须几乎立即返回HTTP 202 (Accepted)作为响应,并在后台继续处理。到目前为止我都很清楚。下面是我的示例代码,我是如何实现相同的。我卡住的地方是,当这个长处理任务在后台完成时,它必须向同一个客户端触发一个回调,并返回一个HTTP 200响应。有可能当长处理任务在后台执行时,客户端发出了另一个具有不同值的并发请求。
谁能给我指个正确的方向?这是否只能通过代码实现,或者是否需要在IIS级别实现任何设置?谢谢你的时间和帮助。提前感谢大家。
My Code so far.
public HttpResponseMessage Execute(string plugin, string pluginType, string grid, string version)
{
try
{
var type = this.LoadPlugin(plugin, pluginType, version);
if (type != null)
{
var method = type.GetMethod("Execute");
if (method != null)
{
new Task(() =>
{
// This line will take long to execute.
var filepath = method.Invoke(Activator.CreateInstance(type), new object[1] { grid });
// After this line it must invoke a callback to the client with the response as "filepath" and HTTP status code as 200
type = null;
}).Start();
}
else
{
return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable);
}
}
else
{
return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable);
}
}
catch (Exception ex)
{
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
return new HttpResponseMessage(HttpStatusCode.Accepted);
}
private Type LoadPlugin(string plugin, string pluginType, string version)
{
Assembly assembly;
Type returnValue = null;
var pluginFile = new DirectoryInfo(this._pluginPath).GetFiles("*.dll")
.Where(file => FileVersionInfo.GetVersionInfo(file.FullName).OriginalFilename.ToUpper().Contains("TRANSFORMATION." + plugin.ToUpper()))
.OrderByDescending(time => time.LastWriteTime).FirstOrDefault();
if (pluginFile != null)
{
assembly = Assembly.LoadFrom(pluginFile.FullName);
AppDomain.CurrentDomain.Load(assembly.GetName());
returnValue = assembly.GetType("Transformation.Plugins." + pluginType);
assembly = null;
}
return returnValue;
}
我认为你可以解决这个问题,使你的Web API方法async:
public async Task<HttpResponseMessage> Execute(string plugin, string pluginType, string grid, string version)
{
// Your code here
}
同样,你的任务调用应该使用await关键字,像这样:
await Task.Run(() =>
{
// Yor code here
});
你可以在async方法中使用多个await。
让我知道这个答案是否有用。