Asp.net core 如何在ASP.NET core 3.1中创建可以返回不同错误返回代码的控制器方法
我需要根据返回对象(结果)返回不同的httpstatus代码。如果是Failure,Error属性将保存由错误代码和我的服务提供的消息组成的序列化信息。 我有以下控制器方法:Asp.net core 如何在ASP.NET core 3.1中创建可以返回不同错误返回代码的控制器方法,asp.net-core,Asp.net Core,我需要根据返回对象(结果)返回不同的httpstatus代码。如果是Failure,Error属性将保存由错误代码和我的服务提供的消息组成的序列化信息。 我有以下控制器方法: [HttpPost] public ActionResult<BasicItemDTO> CreateValue(BasicIItemCreationDTO value) { Result<BasicItemDTO> res = ValuesService.Creat
[HttpPost]
public ActionResult<BasicItemDTO> CreateValue(BasicIItemCreationDTO value)
{
Result<BasicItemDTO> res = ValuesService.CreateValue(value);
if (res.IsFailure) return ErrorFromResult(res.Error);
ActionResult<BasicItemDTO> response = CreatedAtRoute("GetValue", res.Value);
return response;
}
我正在努力解决ErrorFromResult上的返回类型。ErrorFromResult的返回类型应该是什么?因为这是一个API,所以将
CreateValue
的返回类型更改为IActionResult
,并用状态代码或Json
将响应包装如下:
[HttpPost]
public IActionResult CreateValue(BasicIItemCreationDTO value)
{
Result<BasicItemDTO> res = ValuesService.CreateValue(value);
if (res.IsFailure) return ErrorFromResult(res.Error);
//ActionResult<BasicItemDTO> response = CreatedAtRoute("GetValue", res.Value);
var url = Url.RouteUrl("route_name", route_values)
return Created(url, the created value);
}
[HttpPost]
公共IActionResult CreateValue(基本项CreationTo值)
{
Result res=ValuesService.CreateValue(值);
if(res.IsFailure)返回ErrorFromResult(res.Error);
//ActionResult响应=CreatedAtRoute(“GetValue”,res.Value);
var url=url.RouteUrl(“路由名称”,路由值)
创建的返回(url,创建的值);
}
您需要在switch语句中添加一个default标签。如果未执行上述情况,将执行默认标签
switch (ErrorCode)
{
case "Conflict":
ProblemDetails PD = GenerateResponse(ErrorDetail);
return Conflict(PD);
case "NotFound":
return NotFound(ErrorDetail);
default:
return BadRequest(ErrorDetail);
}
此外,正如@HMZ所说,您可以将
CreateValue
的返回类型更改为IActionResult
,使其与ErrorFromResult
的返回类型相同。好的,我已经解决了。如果我对CreateValue方法使用IActionResult,errorFromResult部分工作正常,但由于CreatedAtRoute的返回类型未转换为IActionResult,因此不会编译快乐路径。您需要使用CreateAtRoute的3个参数实现。下面的代码按预期编译和运行
[HttpPost]
public IActionResult CreateValue(BasicIItemCreationDTO value)
{
Result<BasicItemDTO> res = ValuesService.CreateValue(value);
if (res.IsFailure) return ErrorFromResult(res.Error);
IActionResult response = CreatedAtRoute("GetValue",new {ValueId= res.Value.Id },res.Value);
return response;
}
[HttpPost]
公共IActionResult CreateValue(基本项CreationTo值)
{
Result res=ValuesService.CreateValue(值);
if(res.IsFailure)返回ErrorFromResult(res.Error);
IActionResult response=CreatedAtRoute(“GetValue”,新的{ValueId=res.Value.Id},res.Value);
返回响应;
}
感谢您提供有关交换机默认设置的提示。为了简洁起见,我省略了它,因为它与问题没有直接关系。返回的
IActionResult
是否给您带来任何错误?
[HttpPost]
public IActionResult CreateValue(BasicIItemCreationDTO value)
{
Result<BasicItemDTO> res = ValuesService.CreateValue(value);
if (res.IsFailure) return ErrorFromResult(res.Error);
IActionResult response = CreatedAtRoute("GetValue",new {ValueId= res.Value.Id },res.Value);
return response;
}