从静态类返回IHttpActionResult的最佳方法

时间:2017-04-27 21:46:02

标签: c# asp.net .net asp.net-web-api2

我试图编写一个通用方法来使用我的Web API 2返回内部服务器错误...

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

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"));

我知道返回的InternalServerError是ApiController的一个功能,但拥有该Helper会非常有帮助。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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();