如何从生产服务中删除OData innererror

时间:2014-10-06 19:28:43

标签: c# asp.net .net asp.net-web-api odata

spec for Error Response说:

  

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

规范是正确的,在asp.net中,innererror属性提供了有用的信息,例如stacktrace,但我真的不想与我的API客户端共享此信息

到目前为止,我还没有找到从响应中删除此属性的方法,是否可能?

1 个答案:

答案 0 :(得分:3)

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

你需要做四件事:

首先,您应该从默认实现派生自己的OData错误序列化程序。与default ODataErrorSerializer的区别在于覆盖包含以下代码的方法:

bool includeDebugInformation = oDataError.InnerError != null;

将其更改为

bool includeDebugInformation = oDataError.InnerError == null;

或者只是在重写的实现中将值设置为false。我们假设您自己的OData错误序列化程序称为MyODataErrorSerializer

然后,您需要从默认的OData序列化程序提供程序派生自己的OData序列化程序提供程序。与DefaultODataSerializerProvider的区别在于更改以下代码:

private static readonly ODataErrorSerializer _errorSerializer = new ODataErrorSerializer();

到您自己的错误序列化程序:

private static readonly ODataErrorSerializer _errorSerializer = new MyODataErrorSerializer();

假设您自己的序列化程序提供程序名为MyODataSerializerProvider

之后,对ODataMediaTypeFormatters做类似的事情。从[{3}}中导出MyODataMediaTypeFormattersMyODataSerializerProvider使用DefaultODataSerializerProvider代替config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create());

最后,将以下代码添加到Web API OData实现中:

{{1}}