Web API响应中的自定义404错误消息

时间:2018-01-21 17:21:41

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

我需要修改Web API抛出404错误时出现的消息:

现在,如果不存在任何api,请关注访问https://mywebsite/api/foo/?%22%26gt;%26lt;script%26gt;_q_q=)(%26lt;/script%26gt;

我收到以下回复:

  

{“Message”:“找不到与请求URI匹配的HTTP资源   'https://mywebsite/api/foo/ \?“><脚本> _q_q =)(小于/脚本>'。”,   “MessageDetail”:“在控制器'MyController'上找不到任何动作   匹配请求。“}

我想修改此消息。

为了做到这一点,我尝试了这个..

我在控制器上添加了一个自定义属性:

[NoActionFoundFilterAttribute]
public class MyController

过滤器的代码是:

public class NoActionFoundFilterAttribute: ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        // My code
    }
}

在Web API Config中,我已经添加了过滤器:

 config.Filters.Add(new NoActionFoundFilterAttribute());

即使在完成上述所有步骤之后,也会出现OnException  调用无效操作时,未触发“NoActionFoundFilterAttribute”文件。

您是否可以分享我所缺少的内容以修改自定义404错误消息

1 个答案:

答案 0 :(得分:4)

我能够找到解决方案。

这是我做的:

我添加了以下行来挂钩Web API响应管道,以获取Web API返回的消息:

config.MessageHandlers.Add(new WebApiCustomMessageHandler());

然后我像这样实现了WebApiCustomMessageHandler:

public class WebApiCustomMessageHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        if (response.StatusCode == HttpStatusCode.NotFound)
        {
            request.Properties.Remove(HttpPropertyKeys.NoRouteMatched);
            var errorResponse = request.CreateResponse(response.StatusCode, "Content not found.");
            return errorResponse;
        }

        return response;
    }
}

在实现上述解决方案后,我能够从WebAPI修改ContentNotFound响应。答案终于如此:

  

“未找到内容。”