C# 使用angular上传阵列:如何从后端获取错误?

C# 使用angular上传阵列:如何从后端获取错误?,c#,angular,typescript,C#,Angular,Typescript,我有一个非常简单的Angular应用程序,它使用post方法向后端/服务器(一个用C#编写的MS AspNetCore应用程序)发送字符串列表(仅在本例中,实际上是一个称为协议的更复杂数据列表)。这个功能运行得很好,但由于我对angular非常陌生,我正在努力处理这个过程中发生在服务器端的故障。如果出现问题,我想在客户端显示一条错误消息 以下是我在“角度”教程中通过定向构建的内容: 角度组件.ts文件基本上有一种上传方法: constructor( private readonly SV

我有一个非常简单的Angular应用程序,它使用post方法向后端/服务器(一个用C#编写的MS AspNetCore应用程序)发送字符串列表(仅在本例中,实际上是一个称为协议的更复杂数据列表)。这个功能运行得很好,但由于我对angular非常陌生,我正在努力处理这个过程中发生在服务器端的故障。如果出现问题,我想在客户端显示一条错误消息

以下是我在“角度”教程中通过定向构建的内容: 角度组件.ts文件基本上有一种上传方法:

constructor(
    private readonly SVC: UploadService) { }

uploadStringlist(): void {
    let sarray: string[] = [];

    sarray.push("string1");
    sarray.push("string2");

    this.SVC.uploadList(sarray).subscribe(
     _ => { this.finished,emit(`protocols sent: next`)},
     err => { this.finished.emit(`Protocols sent: error` + err)},
     () => { this.finished.emit(`Protocols sent`)});
}
upload.service.ts文件基本上有以下方法:

uploadList(slist: string[]): Observable<string> {
  return this.http.post<string>(apiurl, slist, httpOptions)
    .pipe(
      tap(res => log("uploaded protocol list to server", res)),
      catchError(handleError<string>("test")));
}
所以,无论我在控制器上返回什么,我在客户端都会得到相同的结果。这意味着我得到的结果是:“发送协议”

但理想情况下,我会得到一个结果列表(字符串数组中的每个条目对应一个结果),或者如果我在控制器中返回错误,至少会得到一个错误。
但是我不知道如何实现这一点。

您可以使用
ModelState
在控制器中保留错误处理模式,这样您将确保所有错误返回都具有相同的结构

使用
ModelState
BadRequest
方法将确保将
ModelState
导入代码上的
err
变量:
err=>{this.finished.emit('Protocols sent:error'+err'),

这是基于您的代码的简单示例

[HttpPost]
public IActionResult Post(string[] slist)
{
    try
    {
        foreach (var s in slist)
        {
           // do something
           if(NotValid(s))
           {
               ModelState.AddModelError("", "Your message to the client");
           }
        }

        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        return Ok(new { successMessage = "success"});
    }
    catch(Exception ex)
    {
        // log your exception
        ModelState.AddModelError("", "Your generic error message");
        ModelState.AddModelError("SomeProperty", "Your error message about 'SomeProperty'");
        return BadRequest(ModelState);
    }
}
在客户端,您需要更改此行:

catchError(handleError<string>("test")));
catchError(handleError(“test”);
对这样的事情:

catchError(error => handleError<any>(error)));

查看错误的方法之一是抛出异常,例如:

抛出新的ArgumentException(“发生了不好的事情”);
此外,对于Web API项目,请确保已从
Web.config
文件打开错误报告(但在进入生产时将其关闭):



客户端是如何处理的?我担心我只是订阅服务中的上载方法是不够的。我只是用客户端的更改更新了答案。一旦你在服务器上返回状态代码>=400,你的客户端就会自动知道发生了错误。你只需要在服务器上处理它
.post
方法的
catchError
catchError(error => handleError<any>(error)));