【问题标题】:How to remove the OData innererror from production services如何从生产服务中删除 OData 内部错误
【发布时间】:2014-12-01 03:18:46
【问题描述】:

spec for Error Response 说:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,这是可能的,但是很麻烦。

    你需要做四件事:

    首先,您应该从默认实现派生出您自己的 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 你是对的。让我向团队提出这个问题,看看我们是否可以改进它。
    • 当您使用它时,请将错误消息本地化并从消息中删除调试信息。 " 消息名称/值对的值必须是人类可读的、依赖于语言的错误表示。Content-Language 标头必须包含来自 [RFC5646] 的语言代码,对应于写入消息值的语言。”
    猜你喜欢
    • 2012-02-12
    • 2014-07-02
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2015-02-07
    相关资源
    最近更新 更多