使用WCF webapi获取HTTP 500而不是HTTP 404

时间:2012-01-16 17:48:52

标签: wcf-web-api

我无法在WCF Web API代码中为“未找到”返回正确的HTTP错误代码。这是我的api方法......

    [WebInvoke(Method = "GET", UriTemplate = "{id}")]
    [RequireAuthorisation]
    public Customer GetCustomer(int id)
    {
        var customer = Repository.Find(id);
        if (customer == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return customer;
    }

我也有一个记录处理程序......

    protected override bool OnTryProvideResponse(Exception exception, ref HttpResponseMessage message)
    {
        if (exception != null)
        {
            var msg = "Request failed.";
            _logger.Error(exception, msg);
        }

        message = new HttpResponseMessage
                      {
                          StatusCode = HttpStatusCode.InternalServerError
                      };

        return true;
    }

发生的事情是我得到以下异常......

HttpResponseException

"The response message returned by the Response property of this exception should be immediately returned to the client.  No further handling of the request message is required."

...我的日志记录处理程序选择并将响应状态代码更改为500。

所以,基于在SO上阅读一些博客文章和答案,我改变了这个......

        if (customer == null)
        {
            WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound();
            return null;
        }

...但现在这给了我200分。这显然是错误的。

那么,这样做的正确方法是什么?似乎抛出HttpResponseException不起作用,然后执行代码。

1 个答案:

答案 0 :(得分:2)

错误处理程序的代码段始终将响应消息更改为500,无论您将状态显式设置为500,都会将响应消息更改为500.

听起来你正在尝试做的只是返回500,如果它是一个应用程序错误。如果是这种情况,您应该检查错误异常是否是HttpResponseException并且只返回而不是覆盖。

对于WebOperationContext,不要在Web Api中使用它,因为它基本上是无操作。

希望这会有所帮助 格伦