C# WCF客户端asp.net core3.1中的XML响应分析异常

C# WCF客户端asp.net core3.1中的XML响应分析异常,c#,asp.net-core,wcf,xml-parsing,asp.net-core-3.1,C#,Asp.net Core,Wcf,Xml Parsing,Asp.net Core 3.1,我使用connected service功能将一个soap wcf web服务连接到我的asp.net core 3.1,并生成Reference.cs文件,但每当我尝试调用一个wcf web服务方法时,我都会遇到xml解析错误。我没有控制wcf web服务,因此无法更改响应xml 以下是完整的堆栈跟踪: System.ServiceModel.CommunicationException: Error in deserializing body of reply message for o

我使用
connected service
功能将一个soap wcf web服务连接到我的asp.net core 3.1,并生成
Reference.cs
文件,但每当我尝试调用一个wcf web服务方法时,我都会遇到xml解析错误。我没有控制wcf web服务,因此无法更改响应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, String encodingStyle, 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, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)
   at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
   at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, 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服务的问题,您可以尝试使用.net framework调用此服务。@DingPeng我也怀疑,但我在.net framework中也得到了相同的结果。那么这应该是服务器端问题,您需要检查服务器端。您也可以尝试使用通道工厂调用服务。@DingPeng我最终使用了
ClientMessageInspectors
,并在反序列化之前手动解析和更改回复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>  
[OperationContractAttribute(Action="", ReplyAction="*")]
[FaultContractAttribute(typeof(CA2ServiceReference.InvalidEndEntityProfileNameException), Action="", Name="InvalidEndEntityProfileNameException")]
[FaultContractAttribute(typeof(CA2ServiceReference.RaServiceException), Action="", 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;
        }
    }
}