【问题标题】:Unable to read FaultException from an asp.net core connected service无法从 asp.net 核心连接的服务中读取 FaultException
【发布时间】:2021-08-20 20:49:45
【问题描述】:

我正在尝试在 WCF 客户端上捕获 FaultException。

生成的参考合约是:

        [System.ServiceModel.OperationContractAttribute(Action="urn:wcfname#method", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(Error[]), Action= "urn:wcfname#method", Name="errors")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(Response))]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(Request))]
        service.response method(service.request request);

并且生成的错误类是:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.2")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="wcf")]
    public partial class Error
    {
        
        private string errorCodeField;
        
        private string errorStringField;
        
        private string subErrorCodeField;
        
        private string offendingFieldField;
        
        private System.DateTime timeStampField;
        
        private bool timeStampFieldSpecified;
        
        private string detailStringField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=0)]
        public string errorCode
        {
            get
            {
                return this.errorCodeField;
            }
            set
            {
                this.errorCodeField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string errorString
        {
            get
            {
                return this.errorStringField;
            }
            set
            {
                this.errorStringField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string subErrorCode
        {
            get
            {
                return this.subErrorCodeField;
            }
            set
            {
                this.subErrorCodeField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string offendingField
        {
            get
            {
                return this.offendingFieldField;
            }
            set
            {
                this.offendingFieldField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public System.DateTime timeStamp
        {
            get
            {
                return this.timeStampField;
            }
            set
            {
                this.timeStampField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool timeStampSpecified
        {
            get
            {
                return this.timeStampFieldSpecified;
            }
            set
            {
                this.timeStampFieldSpecified = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public string detailString
        {
            get
            {
                return this.detailStringField;
            }
            set
            {
                this.detailStringField = value;
            }
        }
    }

调用服务的代码如下:

try
{
   //call the service method
}
catch (FaultException<Error[]> ex)
{
   var errorElement = XElement.Parse(ex.CreateMessageFault().GetReaderAtDetailContents().ReadOuterXml());
   var xmlDetail = (string)errorElement;
}
catch (FaultException ex)
{
   var errorElement = XElement.Parse(ex.CreateMessageFault().GetReaderAtDetailContents().ReadOuterXml());
   var xmlDetail = (string)errorElement;

}

当有一个 FaultExeption ex 时,它会进入那里,但错误是空字符串。 如果我评论那部分,它会进入 FaultException ex,但错误又是空字符串。

我正在使用 .netCore 3.1

感谢任何建议。

【问题讨论】:

    标签: wcf .net-core


    【解决方案1】:

    抛出 FaultException 表示通道没有问题。服务抛出异常。 WCF 的 FaultException 消息过于笼统,无法确定具体问题,因此您可以像这样自定义异常消息:

    public class HomeService : IHomeService
          {
              public Student Get(string id)
              {
                  try
                  {
                      //Here, of course, an exception will be thrown
                     var result = Convert.ToInt32(id) / Convert.ToInt32("0");
     
             return new Student() { ID = Convert.ToInt32(id), Name = "hxc", SNS = "001" };
                 }
                 catch (Exception ex)
                 {
                     var reason = new FaultReason("Exception thrown information");
     
                     var code = new FaultCode("500");
     
                     var faultException = new FaultException(reason, code, "It is GET that throws the exception");
     
                     throw faultException;
                 }
             }
         }
    

    【讨论】:

    • 您好,佳瑶,感谢您的反馈。我不管理服务,我只是消费它。问题是我无法读取服务抛出的异常消息
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多