OptimisticConcurrencyException

时间:2012-12-14 10:04:36

标签: breeze

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

如果我引发了一个OptimisticConcurrencyException,那么这就是返回的内容:

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

缺少ExceptionType。在VS的调试模式下,这是正常的。

2 个答案:

答案 0 :(得分:1)

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

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

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

我使用'error'参数返回以下内容

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"

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

我想知道我们的做法有何不同?

答案 1 :(得分:1)

@sascha - 如果你在IIS中运行,你可以在<customErrors>上击败我,但是如果你是少数自我托管的人之一,请参阅Jimmy Bogard's alternative Web Api)。

但我很确定最终做错了。现在这是有利的,但正如吉米在他的帖子中所说,“这可能不是我们想要的东西。”应用程序不应该为客户端暴露未经过滤的异常,例如乐观并发或验证错误。

我打算找到一种更好的方法,最有可能涉及HttpResponseException as described here。我将强烈考虑“自定义异常过滤器”,以受控方式处理未处理的异常。

我不认为该方法属于Breeze本身。这让我觉得需要一个特定于应用程序的解决方案 ......一个知道应该暴露哪些异常以及应该如何表达它们的解决方案。但这种机制很适合教学。一旦你知道如何做,就可以滚动自己的自定义异常处理......并单独保留Web.config。

希望尽快写下这个指导。随意打败我:)