我从自己的Web服务(WCF)中使用Web服务(Java)。我需要获取已签名的SOAP消息请求(带有安全标头签名),我将其发送到Java Web服务并保存(文件,数据库......)。
我已尝试使用BeforeSendRequest方法使用IClientMessageInspector,但请求尚未签名。在发送之前有没有办法获得签名请求?
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var content = request.ToString();
// request is not signed yet
return null;
}
另一种选择可能是手动签署请求' ...我过去使用带有.asmx网络服务的SoapEnvelope类(Microsoft.Web.Services3)来做。 我尝试过使用CustomMessageHeader,但这对我来说是不可能的。
有没有人有想法?
提前致谢
编辑:我终于找到了适用于我的解决方案。我使用了WCF跟踪。 在其中一个步骤中,您必须编辑客户端上的machine.config文件。它可能对每个人都不起作用
如何: 1.修改配置文件以进行跟踪。您需要添加 diagnostics 和 system.diagnostics 信息。
<configuration>
<system.serviceModel>
<diagnostics>
<!-- I need logMessagesAtTransportLevel only -->
<messageLogging
logEntireMessage="false"
logMalformedMessages="false"
logMessagesAtServiceLevel="false"
logMessagesAtTransportLevel="true"
logKnownPii="true"
maxMessagesToLog="1000"
maxSizeOfMessageToLog="200000"/>
</diagnostics>
<binding>...</binding>
<client>...</client>
</system.serviceModel>
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging"
logKnownPii="true"
switchValue="Verbose, ActivityTracing">
<listeners>
<add name="xmlTracer" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xmlTracer" type="MyNamespace.MyTraceListender, MyNamespace" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
</configuration>
创建继承自TraceListener
的类MyTreceListenernamespace MyNamespace
{
public class MyTraceListender : System.Diagnostics.TraceListener
{
public override void Write(string message)
{
Debug.WriteLine(message);
}
public override void WriteLine(string message)
{
Debug.WriteLine(message);
// Here we have the signed SOAP !!
// Make sure it's the request, this method is invoked many times
}
}
}
您可以获取已签名的SOAP消息,但 BinarySecurityToken 已被删除。
...<o:BinarySecurityToken><!--Removed--></o:BinarySecurityToken>...
C:\的Windows \ Microsoft.NET \框架{版本} \配置\ machine.config中 C:\的Windows \ Microsoft.NET \ Framework64 {版本} \配置\ machine.config中
添加 enableLoggingKnownPii 参数
<system.serviceModel>
<machineSettings enableLoggingKnownPii="true"/>
...
</system.serviceModel>
现在,您可以在调用服务时获得完整的签名SOAP消息。
我希望它有助于某人。 :)
答案 0 :(得分:0)
要获取包含已签名元素的消息,您必须创建自定义
频道,您可以在其中对该讯息采取行动。
您可以按照以下两个链接创建频道:
然后,自定义渠道应包含在customBinding中。它必须是最后一个元素:
<bindings>
<customBinding>
<binding name="myBinding">
<textMessageEncoding messageVersion="Soap12WSAddressing10" />
<security messageProtectionOrder="SignBeforeEncryptAndEncryptSignature" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11" />
<httpsTransport />
<myBindingChannel />
</binding>
</customBinding>
</bindings>
新频道必须是最后一个才能获得处理最多的消息。
如果您需要转换绑定,请查看您可以使用此工具制作它:http://webservices20.cloudapp.net/。