gpt4 book ai didi

c# - 如何解析ODATA错误

转载 作者:行者123 更新时间:2023-12-03 07:54:21 25 4
gpt4 key购买 nike

<?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结构。我需要在服务器上解析此错误,然后将新错误传递给客户端。我尝试将其反序列化为各种Exception类型,但是事实是Exception Implement IDICTIONARY阻止了该错误。如何将其反序列化为强类型对象?

如果以上内容不容易实现,我想我的另一个问题是 what is best practice for handling these errors

最佳答案

我对如何处理收到的这些错误消息的建议是创建一个外观相似的类结构,而不是尝试将信息序列化为Exception对象。

如果XML的源决定更改其错误消息的结构,而不是将其基于Exception的结构,则这将为您提供更大的灵活性,此外,它消除了尝试找出方法的要求。反序列化一个Exception对象(根据一些搜索,它要复杂一些)。

因此,使用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内部的实际名称。

关于使异常可序列化,还有一个非常有趣且很好的问答,我也建议阅读:
What is the correct way to make a custom .NET Exception serializable?

关于c# - 如何解析ODATA错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com