使用BreezeJs executeQuery处理来自Web Api的抛出异常(未处理的拒绝原因)

时间:2015-04-16 14:32:12

标签: javascript asp.net asp.net-web-api breeze q

我在MVC应用程序中使用Breeze.js和Q.js.

我目前在webApi上有一个动作

public IQueryable<Myobject> doMyAction()

这可以做两件事:

  • 返回一组对象(如果允许用户)
  • 抛出HTTP异常(如果不允许用户)(可能不是&#34;未经授权&#34;,这只是一个例子)

      

    抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized,&#34; Not Allowed&#34;));

  •   
  这个动作是从带有微风的javascript调用的:

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返回一种动态或通用对象,但这并不是最好的解决方案。

1 个答案:

答案 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 。 (参见文档),虽然抛出一个简单的异常仍然有效。

希望这有帮助。