gpt4 book ai didi

c# - 从 C# 中的 SOAP API 捕获实际错误详细信息

转载 作者:行者123 更新时间:2023-12-05 01:00:59 27 4
gpt4 key购买 nike

在 C# 中访问 SoapAPI 我在我的 c# classLinrery 中添加了 WSDL 文件作为 ServiceRefrence 一些我如何无法捕获该 API 抛出的实际异常

我收到错误消息:-“由于客户端数据引发了异常”。

InnerException:-Null,

为了捕捉实际异常,我尝试了以下代码:-

 public RegisterResponse1 RegisterAccount()
{
try
{
var upss = CreateAccessRequest();
//Process Request
var responce = regService.ProcessRegister(CreateRegisterWebServiceRequest(shipment));
return responce;
}
catch (SoapException ex)
{
//I never go here
return null;
}
catch (FaultException ex)
{
//always go there
return null;
}
catch (Exception ex)
{
return null;
}
}

在上面的异常处理中,我总是对 FaultException(例如)上面的来自 FaultException 的 errorMessaeg 犯规

当我尝试手动从 SoapUI(readyAPI) 工具请求此 API 时,我得到以下错误详细信息,这是 API 方面的实际错误,我想要在我的 c# 库中出现的错误请参阅下面的实际错误详细信息 enter image description here

“无效的访问许可证号”是我要获取的实际消息

请帮助我在 c# 中捕获实际错误详细信息“无效的访问许可证号”,而不是由于客户端数据引发了错误异常

提前谢谢你

最佳答案

是的,我在自己的项目中解决了这个问题很长一段时间,终于找到了解决方案。 WSDL 生成器存在错误生成故障对象的问题,这就是您无法访问它的原因。

要诊断幕后发生的事情,您可以使用 Fiddler 等工具并监控流量。 UPS 正在返回一个故障详细信息,其中包含一条消息,告诉您出了什么问题,但由于生成的对象不正确,您看不到它。

要在任何 UPS API 中解决此问题,请进入生成的 Reference.cs,并在命名空间声明之后添加此类:

// The WSDL generator doesn't properly generate the Errors Class.  This was taken from the UPS Samples.  The FaultContractAttribute was also updated to use this class instead.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.2612.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.ups.com/XMLSchema/XOLTWS/Error/v1.1")]
public partial class Errors : object, System.ComponentModel.INotifyPropertyChanged
{

private ErrorDetailType[] errorDetailField;

private string testElementField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ErrorDetail", Order = 0)]
public ErrorDetailType[] ErrorDetail
{
get
{
return this.errorDetailField;
}
set
{
this.errorDetailField = value;
this.RaisePropertyChanged("ErrorDetail");
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public string TestElement
{
get
{
return this.testElementField;
}
set
{
this.testElementField = value;
this.RaisePropertyChanged("TestElement");
}
}

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

protected void RaisePropertyChanged(string propertyName)
{
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null))
{
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}

然后在文件中搜索 FaultContractAttribute。将其更改为:

[System.ServiceModel.FaultContractAttribute(typeof(Errors), Action="http://onlinetools.ups.com/webservices/ShipBinding/v1.1", Name="Errors", Namespace="http://www.ups.com/XMLSchema/XOLTWS/Error/v1.1")]

您可能需要在 typeof() 语句中调整命名空间。

然后这样的 block 将捕获/返回错误消息:

        catch (FaultException<Errors> ex)
{
return new MyResult
{
ErrorMessage =
$"UPS returned the following errors: {string.Join(", ", ex.Detail.ErrorDetail.Select(ed => ed.PrimaryErrorCode.Description))}"
};
}

这将为您提供 UPS API 调用的完整错误,您可以从那里阅读 API 文档以了解问题所在。

关于c# - 从 C# 中的 SOAP API 捕获实际错误详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47766873/

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