Web api 设计为在发生故障时返回 Http 状态代码。然后,您可以在响应中包含该消息。还有here is a list of possible status codes,您可以发回。对于更常见的响应原因,有内置方法。因此,您的 Web Api 方法最终看起来像这样(请参阅下面的代码示例)。现在调用客户端将知道是否收到状态 200(默认为 Ok),然后服务器上的所有内容都已正确处理,否则处理 Http 状态代码并对消息或响应对象执行某些操作。
此模式将使您不必在所有回复中添加success 和message 属性。它还允许您使用操作过滤器捕获一些常见的验证,例如使用 Authorize 过滤器属性的授权检查。
[HttpGet]
public IHttpActionResult GetData()
{
try {
object somethingToReturn;
// do something to populate your result
return Ok(somethingToReturn);
}
catch(SomeDataException someException){
// log or do something
return BadRequest("The object A could not be found with these parameters!");
}
catch(Exception totallyUnexpectedException){
// log or do something
return InternalServerError();
}
}
那么,为什么不使用 mvc 控制器而不是 web api 呢?
以前有人问过这个问题,请参阅这些 SO 帖子
编辑
基于最新评论。下面是一些代码,您可以使用它们来动态创建通用响应对象,而无需手动包装所有内容。通过创建一些扩展方法,您可以将响应包装器抽象为一些辅助方法。
public class TestController : ApiController
{
[HttpGet]
public IHttpActionResult Get()
{
var success = false;
try
{
var someResult = new SomeObject() {Name = "igor"};
// do something
if (success)
return this.Ok(new SomeObject() {Name = "igor"}); // sends success
return this.Failure(someResult, "some known error"); // sends failure with partial object (if possible)
}
catch (Exception ex)
{
return this.Failure("Something bad happened"); // sends failure with no object because you could not create it
}
}
}
public static class ApiControllerExtensions
{
public static OkNegotiatedContentResult<ResultWrapper<T>> Ok<T>(this ApiController controller, T content)
{
return new OkNegotiatedContentResult<ResultWrapper<T>>(new ResultWrapper<T>() { Result = content, Success = true, Message = null }, controller);
}
public static OkNegotiatedContentResult<ResultWrapper<T>> Failure<T>(this ApiController controller, T content, string message)
{
return new OkNegotiatedContentResult<ResultWrapper<T>>(new ResultWrapper<T>() { Result = content, Success = false, Message = message }, controller);
}
public static OkNegotiatedContentResult<FailureResult> Failure(this ApiController controller, string message)
{
return new OkNegotiatedContentResult<FailureResult>(new FailureResult() { Success = false, Message = message }, controller);
}
}
public class ResultWrapper<T>
{
public T Result { get; set; }
public string Message { get; set; }
public bool Success { get; set; }
}
public class FailureResult // simple class used strictly for failures (unless you ever have an operation with no result that can succeed then modify the name and reuse)
{
public string Message { get; set; }
public bool Success { get; set; }
}
public class SomeObject
{
public string Name { get; set; }
}
编辑
不确定您是否已经尝试过,但我查看了the documentation for extjs。
回调选项
并非每个 AJAX 请求都会成功:有时服务器已关闭,或者您的互联网连接中断,或者发生了其他不好的事情。 Ext.Ajax 允许您为每种情况指定单独的回调
Ext.Ajax.request({
url: 'myUrl',
success: function(response) {
console.log("Spiffing, everything worked");
},
failure: function(response) {
console.log("Curses, something terrible happened");
},
callback: function(options, success, response) {
console.log("It is what it is");
}
});
因此,基于这种模式,我的第一个场景似乎是,按照 Microsoft 的意图使用 Web API,并在出现错误时使用适当的故障状态代码。