1

未正确返回 Optimistic ConcurrencyException。我使用微风 ToDo 示例和我的应用程序对此进行了测试。

如果我引发 OptimisticConcurrencyException,这就是返回的内容:

{"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred."}

缺少 ExceptionType。在 VS 的调试模式下,这可以正常工作。

4

2 回答 2

1

嗯...,当我在测试用例中尝试并发异常时。

// assuming this causes a concurrency exception
em.saveChanges().then(

).fail(function(error) {
   // error object detailed below        
})

我得到以下与“错误”参数一起返回

error.message: "Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries."

error.responseText:    {"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred.","ExceptionMessage":"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.","ExceptionType":"System.Data.OptimisticConcurrencyException","StackTrace":"   at System.Data.Mapping.Update.Internal.UpdateTranslator.ValidateRowsAffected(Int64 <... more here ...> }

error.detail:  < an even more detailed error object
error.detail.ExceptionType: "System.Data.OptimisticConcurrencyException"

还有其他属性,但这些是重要的。

我想知道我们在做什么不同?

于 2012-12-14T18:19:57.507 回答
1

<customErrors>@sascha -如果您在 IIS 中运行,那么您在工作正常的事情上击败了我(如果您是极少数会自行托管 Web Api 的人之一, 请参阅Jimmy Bogard 的替代方案)。

但我很确定最终这样做是错误的。现在这是权宜之计,但正如 Jimmy 在他的帖子中所说,“这可能不是我们在生产中想要的东西。” 应用程序不应将未过滤的异常暴露给客户端,以解决诸如乐观并发或验证错误之类的常规问题。

我打算找到一种更好的方法,很可能涉及此处描述的 HttpResponseException。我将重点考虑使用“自定义异常过滤器”以受控方式处理未处理的异常。

我不认为这种方法属于 Breeze 本身。我觉得它需要一个特定于应用程序的解决方案……一个知道应该公开哪些异常以及应该如何表达它们的解决方案。但是这个机制很好教。一旦你知道如何去做,你就可以滚动你自己的自定义异常处理......并且不理会 Web.config。

希望尽快写出这份指南。随意击败我:)

于 2012-12-15T00:03:58.700 回答