当前位置: 首页 > 知识库问答 >
问题:

如何返回NotFound() IHttpActionResult错误信息或异常?

鲜于喜
2023-03-14

当在我的WebApi GET操作中未找到某些内容时,我正在返回NotFindIHttpActionResult。伴随此响应,我想发送自定义消息和/或异常消息(如果有)。当前的ApiControllerNotFind()方法不提供传递消息的重载。

有什么办法可以做到这一点吗?或者我将不得不编写自己的自定义IHttpActionResult

共有3个答案

卜方伟
2023-03-14

如果您愿意,可以使用响应消息结果

var myCustomMessage = "your custom message which would be sent as a content-negotiated response"; 
return ResponseMessage(
    Request.CreateResponse(
        HttpStatusCode.NotFound, 
        myCustomMessage
    )
);

是的,如果你需要更短的版本,那么我想你需要实现你的自定义动作结果。

东郭骁
2023-03-14

如果您想要自定义响应消息形状,您需要编写自己的操作结果。

我们希望为简单的空404提供现成的最常见的响应消息形状,但我们也希望尽可能保持这些结果简单;使用动作结果的一个主要优点是它使你的动作方法更容易进行单元测试。我们在动作结果上添加的属性越多,你的单元测试需要考虑的东西就越多,以确保动作方法如你所愿。

我经常希望能够提供自定义消息,所以请随时记录错误,以便我们考虑在将来的版本中支持该操作结果:https://aspnetwebstack.codeplex.com/workitem/list/advanced

不过,动作结果的一个好处是,如果你想做一些稍微不同的事情,你总是可以很容易地编写自己的结果。在您的情况下,您可以这样做(假设您想要文本/普通的错误消息;如果你想要JSON,你可以做一些稍微不同的内容):

public class NotFoundTextPlainActionResult : IHttpActionResult
{
    public NotFoundTextPlainActionResult(string message, HttpRequestMessage request)
    {
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }

        if (request == null)
        {
            throw new ArgumentNullException("request");
        }

        Message = message;
        Request = request;
    }

    public string Message { get; private set; }

    public HttpRequestMessage Request { get; private set; }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(Execute());
    }

    public HttpResponseMessage Execute()
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.NotFound);
        response.Content = new StringContent(Message); // Put the message in the response body (text/plain content).
        response.RequestMessage = Request;
        return response;
    }
}

public static class ApiControllerExtensions
{
    public static NotFoundTextPlainActionResult NotFound(this ApiController controller, string message)
    {
        return new NotFoundTextPlainActionResult(message, controller.Request);
    }
}

然后,在你的行动方法中,你可以这样做:

public class TestController : ApiController
{
    public IHttpActionResult Get()
    {
        return this.NotFound("These are not the droids you're looking for.");
    }
}

如果您使用自定义控制器基类(而不是直接从ApiController继承),您还可以消除“this.”部分(不幸的是,调用扩展方法时需要这一部分):

public class CustomApiController : ApiController
{
    protected NotFoundTextPlainActionResult NotFound(string message)
    {
        return new NotFoundTextPlainActionResult(message, Request);
    }
}

public class TestController : CustomApiController
{
    public IHttpActionResult Get()
    {
        return NotFound("These are not the droids you're looking for.");
    }
}
公良运锋
2023-03-14

这里有一个简单消息返回IHttpActionResult NotFound的一行程序:

return Content(HttpStatusCode.NotFound, "Foo does not exist.");
 类似资料:
  • 问题内容: 试图让我的PHP脚本返回一些SQL表查询。这是我目前的脚本: 这是与之关联的Android代码: 以及调用getQuestionsJSON …的方法: 这是我在getQuestionsJSON …()方法中使用的Log.v()的LogCat: 因此,我真的不明白为什么这会返回“问题”,而不是运行getQuestions()时传递的字符串吗? 问题答案: 在PHP文件中 这是对请求的回应

  • 我正在尝试为此方法返回NotFound,但收到以下错误: 不明白应该怎么投,参数等于“1”想退一个404 我只需要这样做:

  • 我试图从输入的日期返回格式为"dd/MM/yyyy"的日期。如果输入的日期具有以下格式:"dd-mm-yyyy",我想返回一个错误:"输入的日期格式无效。"我分享我的代码: 我试图执行以下操作,但这是不正确的,因为我必须返回一个DateTime变量: 我希望你能帮助我!谢啦

  • null 但如果有例外,我该怎么办? null

  • 我正在尝试使用状态代码201的Ihttpstatus标头获取此JSON响应,并将IHttpActionResult作为我的方法返回类型。 我想要返回的JSON: {“客户 ID”: 324} 我的方法: JSON返回: “ID”:324,“日期”:“2014-06-18T17:35:07.8095813-07:00”, 以下是我尝试过的一些返回,它们要么给了我uri null错误,要么给了我类似于

  • 问题内容: 当我将鼠标悬停在任何单词上时,总是显示一个黑框。如果PHP代码返回文本,它将显示在黑框中(应该显示)。但是,如果文本未返回,我希望它返回一个错误函数,以便以后可以更改黑盒的CSS,以使其宽度为而不是。 您可能已经发现,我遗漏了一些不重要的代码。希望有人能理解和帮助我!谢谢! 问题答案: 这正是您可以执行的操作: 在您的PHP文件中: 在您的jQuery AJAX端: