2014-10-06 31 views
1

spec for Error Response说删除的OData innererror:如何从生产服务

为innererror名称/值对的值必须是一个对象。该对象的内容是服务定义的。通常这个对象包含有助于调试服务的信息。内部错误名称/值对应该只在开发环境中使用,以防止围绕信息泄露的潜在安全问题。

该规范是正确的,在asp.net的innererror属性给出了一个有用的信息,如堆栈跟踪,但我真的不想与大家分享我的API客户

由于这一信息呢,我还没有找到从响应中删除这个属性的方法,甚至有可能吗?

回答

3

是的,这是可能的,但是非常麻烦。

你需要做四件事情:

首先,你应该从默认实现派生自己的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()); 
+1

感谢提供一种方式,但我希望你打算做下个版本里就轻松了许多。对于每个书面应用程序规范所要求的事情做这么多工作是错误的。再次,谢谢。 – gdoron 2014-10-09 18:57:25

+2

@gdoron你说得对。让我把这个问题提交给团队,看看我们是否可以改进它。 – 2014-10-10 06:52:32

+0

当您使用它时,请本地化错误消息并从消息中删除调试信息。 “消息名/值对的值必须是一个可读的,依赖于语言的错误表示,TheContent-Language头必须包含来自[RFC5646]的语言代码,该代码对应于写入消息值的语言“。 – gdoron 2014-10-10 08:13:08