从静态 class 到 Return IHttpActionResult 的最佳方法

Best way to Return IHttpActionResult from static class

我正在尝试编写一个通用方法来解决 return 我的 Web API 2...

的内部服务器错误

当我的 Web API 的每个端点都发生错误时,我 return 一个 InternalServerError(new Exception("This is a custom message"))。我有几个站点使用相同的后端和不同的 URL,每个站点都有自己的基于请求 URI 的异常消息(company1.com、company2.com、company3.com),所以我创建了一个通用方法:

private IHttpActionResult getCustomMessage() {
    if(Request.RequestUri.Host.Contains("company1")) {
        return InternalServerError(new Exception("Custom message for company1"));
    }
    if(Request.RequestUri.Host.Contains("company2")) {
        return InternalServerError(new Exception("Custom message for company2"));
    }
    if(Request.RequestUri.Host.Contains("company3")) {
        return InternalServerError(new Exception("Custom message for company3"));
    }
}

但是用相同的代码维护很多这样的方法有点困难(一个由 Controller,我有很多控制器),所以我认为用相同的方法创建一个 Helper 可以帮助减少我的代码并使其更清晰和可维护,但是当我这样做时我遇到了问题 return InternalServerError(new Exception("Custom message to company1, 2, 3"));

我知道 returning InternalServerError 是 ApiController 的一项功能,但拥有该 Helper 真的很有帮助。

感谢您的帮助。

您可以为 ApiController 创建一个新的扩展方法 class:

public static class MyApiControllerExtensions
{
    public IHttpActionResult GetCustomMessage(this ApiController ctrl)
    {
        // this won't work because the method is protected
        // return ctrl.InternalServerError();

        // so the workaround is return whatever the InternalServerError returns
        if (Request.RequestUri.Host.Contains("company1")) 
        {
             return new System.Web.Http.Results.ExceptionResult(new Exception("Custom message for company1"), ctrl);
        }
        if (Request.RequestUri.Host.Contains("company2"))
        {
             return new System.Web.Http.Results.ExceptionResult(new Exception("Custom message for company2"), ctrl);
        }
        if (Request.RequestUri.Host.Contains("company3")) 
        {
             return new System.Web.Http.Results.ExceptionResult(new Exception("Custom message for company3"), ctrl);
        }
    }
}

然后在控制器中:

return this.GetCustomMessage();