我在MVC应用程序中使用Breeze.js和Q.js.
我目前在webApi上有一个动作
public IQueryable<Myobject> doMyAction()
这可以做两件事:
抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized,&#34; Not Allowed&#34;));
var query = EntityQuery.from('doMyAction');
// execute the query
dcCore.manager.executeQuery(query)
.then(querySucceeded)
.fail(dcCore.queryFailed);
如果用户被授权且逻辑为真,那么我连接到我的数据库并返回一个很好的Myobject()列表,一切都很好。
然而,如果我做了抛出异常,说他们是未经授权的,那么在控制台中我得到我的401(未经授权)和消息:
[问]未处理的拒绝原因(应为空):
这会在它到达.fail()函数之前发生。
我也尝试在整个执行位周围放置一个try / catch,希望我会发现错误,但没有运气。
我可以看到为什么这在理论上正在发生,因为我没有返回executeQuery期待的东西(实际上,我根本没有返回,我正在投掷!),但是,
如何使用breeze处理来自webApi的返回错误,而无需像扩展模型那样做什么?
我唯一要做的就是让我的Web API返回一种动态或通用对象,但这并不是最好的解决方案。
答案 0 :(得分:1)
你有两种方法,第一种是直接在你的查询方法中抛出一个简单的异常,就像这样:
[HttpGet]
public IQueryable<Customer> CustomersStartingWith(string companyName) {
if (companyName == "null") {
throw new Exception("nulls should not be passed as 'null'");
}
...
}
或者,如果您希望稍微控制一下HTTPResponse,可以执行以下操作:
[HttpGet]
public IQueryable<Customer> CustomersWithHttpError() {
var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound);
responseMsg.Content = new StringContent("Custom error message");
responseMsg.ReasonPhrase = "Custom Reason";
throw new HttpResponseException(responseMsg);
}
请注意,对于保存操作而非上述查询操作,最佳方法是抛出 EntityErrorsException 。 (参见文档),虽然抛出一个简单的异常仍然有效。
希望这有帮助。