asp.net如何解析 ODATA 错误

标签: Asp.net .Net OData C#
发布时间: 2017/3/26 5:28:17
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <m:code />
    <m:message xml:lang="en-US">An error occurred while processing this request.</m:message>
    <m:innererror>
        <m:message>Exception has been thrown by the target of an invocation.</m:message>
        <m:type>System.Reflection.TargetInvocationException</m:type>
        <m:stacktrace></m:stacktrace>
        <m:internalexception>
            <m:message>An error occurred while executing the command definition. See the inner exception for details.</m:message>
            <m:type>System.Data.Entity.Core.EntityCommandExecutionException</m:type>
            <m:stacktrace></m:stacktrace>
            <m:internalexception>
                <m:message>Cannot insert duplicate key row in object 'XXXX' with unique index 'XXXXXX'. The duplicate key value is (XXXXX)</m:message>
                <m:type>System.Data.SqlClient.SqlException</m:type>
                <m:stacktrace></m:stacktrace>
            </m:internalexception>
        </m:internalexception>
    </m:innererror>
</m:error>" System.Data.Services.Client.DataServiceClientException

我有这回来从 WEB API 2 ODATA 源的 XML 结构。我需要解析此服务器上的错误,然后将一个新的错误传递到客户端。我已经尝试反序列化这对各种异常类型,但异常实现 IDICTIONARY 停止,这一事实。怎么可以我反序列化这成一个强类型的对象?

如果上述情况不是很容易向下,我猜我其他的问题是what is best practice for handling these errors

解决方法 1:

我的建议如何处理你所得到的这些错误消息是创建类似看类结构而不是试图序列化到信息 Exception 对象。

这允许有点更多的灵活性,您的最终,以防您的 XML 源决定改变而不是基于结构的异常,其错误消息的结构再加上它免除了试着弄清楚如何反序列化异常对象 (即根据一些搜索多一点复接)。

所以使用 Visual Studio 中的工具将 XML 文本转换成 C# 类 (下找到 Edit => Paste Special => Paste XML as Classes ),以下类得到结构。
从该工具所生成的因为它喜欢大量膨胀类修改的实际结构。

[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")]
[XmlRootAttribute(ElementName = "error", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", IsNullable = false)]
public partial class ODATAException
{
  public string code { get; set; }
  public ODATAErrorMessage message { get; set; }
  public ODATAInternalException innererror { get; set; }
}

[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")]
public partial class ODATAErrorMessage
{
  [XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/XML/1998/namespace")]
  public string lang { get; set; }

  [XmlTextAttribute()]
  public string Value { get; set; }
}

[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")]
public partial class ODATAInternalException
{
  public string message { get; set; }
  public string type { get; set; }
  public string stacktrace { get; set; }
  public ODATAInternalException internalexception { get; set; }
}

利用此类结构,你可以然后容易反接收的 XML 序列化成一个强类型化对象并使用它进一步以哪种方式你喜欢。

using (TextReader sampleTextReader = new StringReader(txtInput.Text)) // Change this whereever you get the XML string from
{
  XmlSerializer sampleXmlSeri = new XmlSerializer(typeof(ODATAException));
  ODATAException newExc = sampleXmlSeri.Deserialize(sampleTextReader) as ODATAException;

  if (newExc != null)
  {
    // Do something with the error
  }
}

你现在还免费给变量任何对自己更具有描述性的名字 / 你团队和使用 XmlElement 属性来将您的属性链接到 XML 里面的实际名称。

也是一个非常有趣和良好的 Q / A 关于使异常可序列化的我会推荐以及阅读︰
使自定义的.NET 异常可序列化的正确方法是什么?

官方微信
官方QQ群
31647020