是的,这是可能的,但是非常麻烦。
你需要做四件事情:
首先,你应该从默认实现派生自己的OData错误串。从default ODataErrorSerializer的差异将覆盖包含下面的代码的方法:
bool includeDebugInformation = oDataError.InnerError != null;
将其更改为
bool includeDebugInformation = oDataError.InnerError == null;
或简单地设置您的重写实现价值false
。假设你自己的OData错误序列化器被称为MyODataErrorSerializer
。
然后,您需要从默认值中派生出您自己的OData序列化器提供程序。从DefaultODataSerializerProvider差异会改变如下代码:
private static readonly ODataErrorSerializer _errorSerializer = new ODataErrorSerializer();
到自己的错误串行:
private static readonly ODataErrorSerializer _errorSerializer = new MyODataErrorSerializer();
比方说,你自己的序列提供程序被调用MyODataSerializerProvider
。
之后,做类似的事情ODataMediaTypeFormatters
。从DefaultODataMediaTypeFormatters导出MyODataMediaTypeFormatters
,其使用MyODataSerializerProvider
而不是DefaultODataSerializerProvider
。
最后,下面的代码添加到您的Web API的OData实现:
config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create());
感谢提供一种方式,但我希望你打算做下个版本里就轻松了许多。对于每个书面应用程序规范所要求的事情做这么多工作是错误的。再次,谢谢。 – gdoron 2014-10-09 18:57:25
@gdoron你说得对。让我把这个问题提交给团队,看看我们是否可以改进它。 – 2014-10-10 06:52:32
当您使用它时,请本地化错误消息并从消息中删除调试信息。 “消息名/值对的值必须是一个可读的,依赖于语言的错误表示,TheContent-Language头必须包含来自[RFC5646]的语言代码,该代码对应于写入消息值的语言“。 – gdoron 2014-10-10 08:13:08