【问题标题】:Handling thrown exceptions from WebApi with BreezeJs executeQuery (Unhandled rejection reasons)使用 BreezeJs executeQuery 处理来自 Web Api 的抛出异常(未处理的拒绝原因)
【发布时间】:2015-06-23 01:05:55
【问题描述】:

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

我目前在我的 webApi 上有一个操作

public IQueryable<Myobject> doMyAction()

这可以做两件事:

  • 返回对象集合(如果允许用户)
  • 抛出 HTTP 异常(如果不允许用户)(它可能不是“未经授权”,这只是一个示例)

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

这个动作是从 javascript 中调用的,带有以下命令:
var query = EntityQuery.from('doMyAction');

    // execute the query
    dcCore.manager.executeQuery(query)
      .then(querySucceeded)
      .fail(dcCore.queryFailed);

如果用户被授权并且逻辑正确,那么我连接到我的数据库并返回一个很好的 Myobject() 列表,一切都很好。

但是,如果我抛出异常说他们未经授权,那么在控制台中我会得到我的 401(未经授权)和消息:

[Q] 未处理的拒绝原因(应为空):

这发生在它到达 .fail() 函数之前。

我还尝试在整个执行位周围放置一个 try/catch,希望我能捕获一个错误,但没有运气。

我可以看到为什么理论上会发生这种情况,因为我没有返回 executeQuery 所期望的东西(事实上,我根本没有返回,我正在扔!),但是,

-实际问题

我应该如何处理从 webApi 返回的错误,而不做像扩展模型这样的事情?

我还没有尝试的唯一方法是让我的 Web API 返回一种动态或通用对象,但这并不是最好的解决方案。

【问题讨论】:

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


    【解决方案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);
    }
    

    请注意,对于 Save 操作而不是上述 Query 操作,最好的方法是抛出 EntityErrorsException。 (请参阅文档),尽管抛出一个简单的异常仍然有效。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多