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;
}
}
}