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