C# .net核心web api-控制器能否将参数传递给中间件?

C# .net核心web api-控制器能否将参数传递给中间件?,c#,asp.net-web-api,error-handling,middleware,C#,Asp.net Web Api,Error Handling,Middleware,嗨,我需要捕获http请求的异常,例如: [HttpPost("Test")] public async Task<ActionResult<TestResponse>> Test(TestRequest request) { TestResponse result; try { // call 3rd party service }

嗨,我需要捕获http请求的异常,例如:

    [HttpPost("Test")]
    public async Task<ActionResult<TestResponse>> Test(TestRequest request)
    {
        TestResponse result;
        try
        {
           // call 3rd party service
        }
        catch(exception ex)
        {
          result.Errorcode = "Mock" // This Errorcode will be used by client side
        }

        return Ok(result);
    }

我不知道如何使用中间件方法分配错误代码,正如我在上面所评论的那样。可能吗?谢谢。

如果我很了解您的要求,我建议:

您不需要访问TestResponse,您可以在中间件中配置您的响应

public class FailResponseModel
{
    public FailResponseModel(string errorCode, object errorDetails)
    {
        ErrorCode = errorCode;
        ErrorDetails = errorDetails;
    }

    public string ErrorCode { get; set; }

    public object ErrorDetails { get; set; }
}

public class ExceptionHandlerMiddleware
{
    readonly RequestDelegate next;

    public Middleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await next(httpContext);
        }
        catch (Exception ex)
        {
            httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            httpContext.Response.ContentType = "application/json";
            var response =
                JsonConvert.SerializeObject(new FailResponseModel("your-error-code", "your-error-details"));

            await httpContext.Response.WriteAsync(response);
        }
    }
}

TestResponse是您的ResponseModel吗?我的意思是,它是所有API的响应结构吗?@Arsalan Valoojerdi我有一个抽象类,名为BaseResponse,它定义了属性“ErrorCode”,从BaseResponse继承了多个类,用于不同的API,您可以使用自定义异常并在中间件中捕获它,但需要在控制器操作的catch块中重新调用。或在异常发生后将值存储在HttpContext(
this.HttpContext.Items[“我的键”]=“我的值”
)中是否有任何其他数据要发送给客户端,或者只是错误代码?@Arsalan Valoojerdi just 2个属性-ResponseModel中的Errorcode和ErrorDetails
public class FailResponseModel
{
    public FailResponseModel(string errorCode, object errorDetails)
    {
        ErrorCode = errorCode;
        ErrorDetails = errorDetails;
    }

    public string ErrorCode { get; set; }

    public object ErrorDetails { get; set; }
}

public class ExceptionHandlerMiddleware
{
    readonly RequestDelegate next;

    public Middleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await next(httpContext);
        }
        catch (Exception ex)
        {
            httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            httpContext.Response.ContentType = "application/json";
            var response =
                JsonConvert.SerializeObject(new FailResponseModel("your-error-code", "your-error-details"));

            await httpContext.Response.WriteAsync(response);
        }
    }
}