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中的异步HTTP请求

我认为你可以解决这个问题,使你的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。

让我知道这个答案是否有用。