【发布时间】:2021-06-24 02:30:14
【问题描述】:
我正在寻找一种解决方法来读取传入的 soapenv => 安全部分。
我一直在尝试从传入的请求中获取soapenv,但没有成功:
int operationIndex = OperationContext.Current.IncomingMessageHeaders.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
string operation = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(operationIndex);
这是一个关于如何格式化标题的示例:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-1">
<wsse:Username>TheUsername</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">XXXXXXXXXXXXXXXX</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">XXXXXXXXXXXXX</wsse:Nonce>
<wsu:Created>XXXXXXXXXX</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<tem:AMethod>
<!--Optional:-->
<tem:field>2</tem:field>
</tem:AMethod>
</soapenv:Body>
</soapenv:Envelope>
还有其他方法可以读取传入的肥皂标题吗?
编辑
刚刚找到了另一种获取soapheader的方法
var headerContent = OperationContext.Current.IncomingMessageHeaders.Select((value, i) => new { i, value }).ToList().Where(x => x.value.Name.ToLower().Equals("security")).FirstOrDefault();
XmlDictionaryReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(headerContent.i);
string xmlSecurityHeader = xr.ReadOuterXml();
【问题讨论】:
-
没有运气是什么意思?操作指数是-1还是别的?
IncomingMessageHeaders实现IEnumerable。您是否尝试枚举所有标题以查看其中的内容? -
我刚刚找到了另一种获取相关标头的方法:
codevar headerContent = OperationContext.Current.IncomingMessageHeaders.Select((value, i) => new { i, value }).ToList( ).Where(x => x.value.Name.ToLower().Equals("security")).FirstOrDefault(); XmlDictionaryReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(headerContent.i);字符串 xmlSecurityHeader = xr.ReadOuterXml()code