异步 API 方法 [已关闭]

Asynchronous API method [closed]

提问人:5ra 提问时间:9/10/2021 最后编辑:Peter Csala5ra 更新时间:9/10/2021 访问量:58

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

2年前关闭。

我有一个 Web API 方法,用于检查用户上传的文件。它检查病毒、文件类型等。这被检查了 1-2 分钟(因为这个检查是在我无法访问的服务器中完成的,长话短说),用户在检查他的文件时必须等待 1-2 分钟,然后 API 接收并返回消息“您的上传(未)成功”到我的 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());
    }
}  
C# AngularJS API 异步

评论


答:

0赞 OlegI 9/10/2021 #1

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

评论

0赞 5ra 9/10/2021
如果在此软件验证文件后调用我的方法,那么在我的 angular 项目中的某个地方进行 async-await 是否足以调用此 API 方法?
0赞 OlegI 9/10/2021
异步等待与此无关。您需要一个单独的 GET 端点来获取文件验证状态。您在问题中描述的端点用于触发操作 (POST),因此您需要另一个端点来获取操作状态(文件验证)