如何反序列化WCF中的自定义SOAP标头?我正在尝试通过WCF向所有SOAP请求添加自定义标头。我找到了这篇关于如何做到这一点的好文章。我的MessageHeader类如下所示:publicclassOperatorNameMessageHeader:MessageHeader{privatestringopName;publicconststringHeaderName="OperatorNameMessageHeader";publicconststringHeaderNamespace="http://schemas.microsoft.com/scout";publicoverridestringName{get{returnHeaderName;}}publicoverridestringNamespace{get{returnHeaderNamespace;}}publicstringOperatorName{get{returnopName;}设置{opName=值;}}publicOperatorNameMessageHeader(){}publicOperatorNameMessageNameHeader(stringoperator){opName=operatorName;}protectedoverridevoidOnWriteHeaderContents(XmlDictionaryWriterwriter,MessageVersionmessageVersion){writer.WriteElementString("OperatorName",opName);文章没有说的一件事是如何读取服务器上的值。根据这篇文章,您可以使用OperationContext.Current.IncomingMessageHeaders来读取这些标头。当我在调试器下查看这些MessageHeaders时,我看到3个包含我的自定义标头。所以它肯定会出现在SOAP数据中。但是当我调用GetHeader时:然后test.OperatorName为空。基本上,我只是取回一个空的OperatorNameMessageHeader对象,该对象尚未从SOAP中的数据反序列化。我的下一步是运行WCF跟踪工具。当我这样做时,我可以验证自定义标头确实通过网络发送:f9bef03b-4e7b-4e84-b327-5e79814d9933正确的操作员名称http://localhost:90/IRolesAndResourcesManagerhttp://tempuri.org/IRolesAndResourcesManager/Authenticate所以,服务器有数据,我拿不到。这个问题的解决方案是什么?我有类似的问题。我必须从标题中读取用户名和密码。我找到了一个时间解决方案,我正在使用XmlDictionaryReader。但是使用这段代码我只查找名称,我仍然可以改进它,但现在工作。我在VB里面有,会和C#差不多以上是C#学习教程:HowtodeserializecustomSOAPheaderinWCF?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——DimusernameAsString=""DimpasswordAsString=""DimusernameTokenIdAsString=""DimpasswordTypeAsString=""ForiAsInteger=0ToOperationContext.Current.IncomingMessageHeaders.Count-1DimmhiAsChannels.MessageHeaderInfo=OperationContext.Current.IncomingMessageHeaders.Item(i)DimheadersAsChannels.MessageHeaders=OperationContext。当前.RequestContext。RequestMessage.HeadersIfmhi.Name.Equals("Security")ThenDimxrAsXmlDictionaryReader=OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i)xr.MoveToContent()而xr.MoveToNextAttribute()Console.Write("{0}='{1}'",xr.Name,xr.Value)EndWhileDoSelectCasexr.NodeTypeCaseXmlNodeType.ElementIfxr.LocalName.Equals("Username")Thenusername=xr.ReadElementContentAsString()EndIfIfxr.LocalName.Equals("密码")然后密码=xr.ReadElementContentAsString()EndIfWhilexr.MoveToNextAttribute()Ifxr.LocalName.Equals("Id")ThenusernameTokenId=xr.ValueEndIfIfxr.LocalName.Equals("Type")ThenpasswordType=xr.ValueEndIfEndWhileCaseXmlNodeType.Attribute'CaseXmlNodeType.Text'Console.Write(xr.Value)'CaseXmlNodeType.EndElement'Console.Write("",xr.Name)结束选择循环Whilexr.Read()EndIfDimnameAsString=mhi.NameNext本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
