异步API方法

Asynchronous API method

我有一个 Web API 方法可以检查用户上传的文件。它检查病毒、文件类型等。这被检查了 1-2 分钟(因为这个检查是在我无法访问的服务器上完成的,长话短说)并且用户在检查他的文件时必须等待 1-2 分钟,然后 API 收到 returns 消息“您的上传(不)成功”到我的 Angular 项目。

嗯,我想要的是调用 API,但是在检查文件时我想让用户在应用程序中自由导航。当检查完成后,我想给他一个注释(在他当时所在的任何页面上)他上传成功或不成功。

我不知道这是否可行,我假设我必须在 API 中将我的方法转换为异步,但我不知道从哪里开始(对此是新的)。任何提示都会很棒。

这是我目前在API中的方法:

public HttpResponseMessage Create()
{
    try
    {
        HttpRequest request = HttpContext.Current.Request;

        HttpPostedFile file = request.Files[0];
        string fileExtension = Path.GetExtension(file.FileName);
        string fileName = Path.GetFileNameWithoutExtension(file.FileName);
        string fileFolder = GetFolder();
        sqlDataAccess.ExecuteQuery("spCreateDokument", ar); //I deleted ar declarations and filling, to reduce code

        int id = sqlDataAccess.GetParamValue<int>(ar, "@Id");

        // file is saved to disk
        string filePath = Path.Combine(GetFolder(), id.ToString() + Path.GetExtension(file.FileName));
        file.SaveAs(filePath);

        return Request.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception ex)
    {
        throw ProcessException(ex, System.Reflection.MethodBase.GetCurrentMethod());
    }
}  

有两种可能的选择来实现它。它要么轮询端点,要么实施 WebSockets(ASP.NET SignlarR 是原始 WebSockets 的包装器)。因此,您的后端需要知道文件验证何时完成。但是,如果您无权访问运行验证本身的代码,则需要知道它提供了哪种机制以便在验证完成时获取信息。如果可能的话,您还需要进行轮询,或者可能有一个 webhook 等。 当谈到轮询与 WebSockets 时。轮询期间的主要区别是,客户端代码会按计划向后端发送请求并询问:“是否已经完成?”,而使用 WebSockets:客户端将订阅并监听后端:“一旦完成,请通知我”。所以总的来说,WebSockets 是一个更好的选择,但实现会更复杂。走哪条路由你决定