WCF客户端ASP.NET Core3.1中的XML响应解析异常

问题描述

我使用Connected Service功能将soap wcf Web服务连接到我的asp.net core 3.1并生成Reference.cs文件,但是每当我尝试调用其中一种wcf Web服务方法时,我都会得到xml解析错误。我无法控制wcf网络服务,因此无法更改响应xml。

这是完整的堆栈跟踪:

  System.ServiceModel.CommunicationException: Error in deserializing body of reply message for operation 'getSubjectFieldsByName'.
 ---> system.invalidOperationException: There is an error in XML document (1,254).
 ---> System.Xml.XmlException: End element 'item' from namespace '' expected. Found element 'subjectDnField' from namespace ''. Line 1,position 254.
   at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader,String res,String arg1,String arg2,String arg3)
   at System.Xml.XmlBaseReader.ReadEndElement()
   at System.Xml.XmlBaseReader.ReadElementContentAsstring()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderRaService.Read22_getSubjectFieldsByNameResponse()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer12.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,String encodingStyle,XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,XmlDeserializationEvents events)
   at System.ServiceModel.dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader,MessageVersion version,XmlSerializer serializer,MessagePartDescription returnPart,MessagePartDescriptionCollection bodyParts,Object[] parameters,Boolean isRequest)
   --- End of inner exception stack trace ---
   at System.ServiceModel.dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader,Boolean isRequest)
   at System.ServiceModel.dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader,String action,MessageDescription messageDescription,Boolean isRequest)
   at System.ServiceModel.dispatcher.OperationFormatter.DeserializeBodyContents(Message message,Boolean isRequest)
   at System.ServiceModel.dispatcher.OperationFormatter.DeserializeReply(Message message,Object[] parameters)
   at System.ServiceModel.dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation,ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action,Object[] outs,IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.<>c__displayClass1_0.<CreateGenericTask>b__0(IAsyncResult asyncResult)
--- End of stack trace from prevIoUs location where exception was thrown ---
   at RA.Services.CAService.GetProfileDetailAsync(Int64 pkiId,String profileName) in C:\IRIbroadcasting\RA\RA\Services\CAService.cs:line 164

我记录了xml请求,并从wcf响应,并且提示正确。
响应xml是:

<?xml version="1.0" encoding="utf-16"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header />
  <env:Body>
    <ns1:getSubjectFieldsByNameResponse xmlns:ns1="https://localhost:8443/ira/ws">
      <return xmlns:ns2="https://localhost:8443/ira/ws">
        <item>
          <subjectDnField>DN_PKIX_COMMONNAME</subjectDnField>
          <defaultValue></defaultValue>
          <isrequired>true</isrequired>
          <isModifiable>true</isModifiable>
        </item>
        <item>
          <subjectDnField>DN_PKIX_SERIALNUMBER</subjectDnField>
          <defaultValue></defaultValue>
          <isrequired>true</isrequired>
          <isModifiable>true</isModifiable>
        </item>
      </return>
    </ns1:getSubjectFieldsByNameResponse>
  </env:Body>
</env:Envelope>  

Reference.cs中为此函数生成的类和方法如下:

[OperationContractAttribute(Action="",ReplyAction="*")]
[FaultContractAttribute(typeof(CA2ServiceReference.InvalidEndEntityProfileNameException),Action="",Name="InvalidEndEntityProfileNameException")]
[FaultContractAttribute(typeof(CA2ServiceReference.RaServiceException),Name="RaServiceException")]
[XmlSerializerFormatAttribute(SupportFaults=true)]
Task<getSubjectFieldsByNameResponse> getSubjectFieldsByNameAsync(getSubjectFieldsByNameRequest request);  

[EditorbrowsableAttribute(EditorbrowsableState.Advanced)]
System.Task<getSubjectFieldsByNameResponse> RaService.getSubjectFieldsByNameAsync(getSubjectFieldsByNameRequest request)
{
    return base.Channel.getSubjectFieldsByNameAsync(request);
}
    
public Task<getSubjectFieldsByNameResponse> getSubjectFieldsByNameAsync(string profileName)
{
    getSubjectFieldsByNameRequest inValue = new getSubjectFieldsByNameRequest();
    inValue.profileName = profileName;
    return ((RaService)(this)).getSubjectFieldsByNameAsync(inValue);
}

[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil","2.0.2")]
[EditorbrowsableAttribute(System.ComponentModel.EditorbrowsableState.Advanced)]
[MessageContractAttribute(WrapperName="getSubjectFieldsByNameResponse",WrapperNamespace="https://localhost:8443/ira/ws",IsWrapped=true)]
public partial class getSubjectFieldsByNameResponse
{
    [MessageBodyMemberAttribute(Namespace="",Order=0)]
    [XmlArrayAttribute()]
    [XmlArrayItemAttribute("item",Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public SubjectItem[] @return;
    
    public getSubjectFieldsByNameResponse()
    {
    }
    
    public getSubjectFieldsByNameResponse(SubjectItem[] @return)
    {
        this.@return = @return;
    }
}

[GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil","2.0.2")]
[DebuggerStepThroughAttribute()]
[XmlTypeAttribute(Namespace="https://localhost:8443/ira/ws")]
public partial class SubjectItem
{
    private string subjectDnFieldField;
    private string defaultValueField;
    private string valueField;
    private bool isrequiredField;
    private bool isModifiableField;
    
    /// <remarks/>
    [XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified,Order=0)]
    public string subjectDnField
    {
        get
        {
            return this.subjectDnFieldField;
        }
        set
        {
            this.subjectDnFieldField = value;
        }
    }
    
    /// <remarks/>
    [XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified,Order=1)]
    public string defaultValue
    {
        get
        {
            return this.defaultValueField;
        }
        set
        {
            this.defaultValueField = value;
        }
    }
    
    /// <remarks/>
    [XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified,Order=2)]
    public string value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
    
    /// <remarks/>
    [XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified,Order=3)]
    public bool isrequired
    {
        get
        {
            return this.isrequiredField;
        }
        set
        {
            this.isrequiredField = value;
        }
    }
    
    /// <remarks/>
    [XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified,Order=4)]
    public bool isModifiable
    {
        get
        {
            return this.isModifiableField;
        }
        set
        {
            this.isModifiableField = value;
        }
    }
}

我不确定问题出在哪里,所以我尝试包括我认为与该问题有关的大部分内容
我试图更改几个属性和参数,但是得到的最好结果是一个空的输出对象。这是关于生成错误的类和xml属性错误吗?如何解决解析过程?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)