提问人:5ra 提问时间:9/10/2021 最后编辑:Peter Csala5ra 更新时间:9/10/2021 访问量:58
异步 API 方法 [已关闭]
Asynchronous API method [closed]
问:
我有一个 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());
}
}
答:
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),因此您需要另一个端点来获取操作状态(文件验证)
评论