如何从生产服务中删除 OData 内部错误

gdo*_*ica 5 .net c# asp.net odata asp.net-web-api

错误响应规范说:

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

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

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

Yi *_*SFT 4

是的,这是可能的,但是相当麻烦。

你需要做四件事:

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

bool includeDebugInformation = oDataError.InnerError != null;
Run Code Online (Sandbox Code Playgroud)

将其更改为

bool includeDebugInformation = oDataError.InnerError == null;
Run Code Online (Sandbox Code Playgroud)

或者简单地将值设置为false您覆盖的实现中。假设您自己的 OData 错误序列化程序名为MyODataErrorSerializer

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

private static readonly ODataErrorSerializer _errorSerializer = new ODataErrorSerializer();
Run Code Online (Sandbox Code Playgroud)

到你自己的错误序列化器:

private static readonly ODataErrorSerializer _errorSerializer = new MyODataErrorSerializer();
Run Code Online (Sandbox Code Playgroud)

假设您自己的序列化器提供程序称为MyODataSerializerProvider.

之后,做类似的事情ODataMediaTypeFormattersMyODataMediaTypeFormattersDefaultODataMediaTypeFormatters派生,它使用MyODataSerializerProvider而不是DefaultODataSerializerProvider.

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

config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create());
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供一种方法,但我确实希望您计划在下一个版本中使其变得更加容易。为每个书面应用程序的规范所要求的事情做这么多工作是错误的。再次感谢。 (3认同)
  • @gdoron你是对的。让我向团队提出这个问题,看看我们是否可以改进它。 (3认同)