2

我对 Web API 非常陌生,并且正在尝试一些 API 控制器异常。我的问题是当抛出异常时,应用程序将返回太多信息,其中包括堆栈跟踪和正在返回的模型的一些属性。我想知道返回的异常是否可以仅限于一条消息?

这是一个例子:

public IEnumerable<Appointments> GetAll(int id)
{
    IEnumerable<Appointments> appointments = icdb.Appointments.Where(m => m.Id== id).AsEnumerable();
    return appointments;
}

如果这会返回异常(差异问题),它将返回如下内容:

{"Message":"发生错误。","ExceptionMessage":"'ObjectContent`1' 类型未能序列化内容类型 'application/json; charset=utf-8' 的响应正文。","ExceptionType ":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生错误。","ExceptionMessage":"检测到属性 'UpdateBy' 类型为 'System. Data.Entity.DynamicProxies.User_B23589FF57A33929EC37BAD9B6F0A5845239E9CDCEEEA24AECD060E17FB7F44C'。路径'[0].UpdateBy.UserProfile.UpdateBy.UserProfile'。","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":........ …………………………………………………………………………………………: : : }

正如您所注意到的,它会返回一个堆栈跟踪,其中包含我模型的大部分属性。有没有一种方法可以在抛出异常时返回一条消息?

4

1 回答 1

2

你提到你有一个 API 控制器。如果遇到错误,您应该这样做:

// A handled exception has occurred so return an HTTP status code
return Request.CreateResponse<string>(HttpStatusCode.BadRequest, your_message);

因此,对于您给定的示例代码,您可以使用以下内容:

public IEnumerable<Appointments> GetAll(int id)
{
    IEnumerable<Appointments> appointments= null;
    try {
        icdb.Appointments.Where(m => m.Id== id).AsEnumerable();
    }
    catch {
        var message = new HttpResponseMessage(HttpStatusCode.BadRequest);
        message.Content = new StringContent("some custom message you want to return");
        throw new HttpResponseException(message);
    }
    return appointments;
}

如果您的控制器遇到未处理的异常,则调用代码将收到 500 状态。

于 2013-03-28T04:23:38.687 回答