【发布时间】:2015-10-21 13:05:27
【问题描述】:
我正在使用我自己的 Web 服务 (WCF) 中的 Web 服务 (Java)。我需要获取我要发送到 Java Web 服务的签名 SOAP 消息请求(带有签名的安全标头)并保存它(文件、数据库......)。
我尝试使用 IClientMessageInspector 使用 BeforeSendRequest 方法,但请求尚未签名。有什么方法可以在发送之前获取签名请求?
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var content = request.ToString();
// request is not signed yet
return null;
}
另一种选择可能是“手动”签署请求...我过去是使用带有 .asmx Web 服务的 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 的类 MyTreceListener
namespace 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>...
- 如果您需要消息中的 PII 信息,您必须在客户端编辑 de machine.config。
C:\Windows\Microsoft.NET\Framework{版本}\Config\machine.config C:\Windows\Microsoft.NET\Framework64{版本}\Config\machine.config
添加enableLoggingKnownPii参数
<system.serviceModel>
<machineSettings enableLoggingKnownPii="true"/>
...
</system.serviceModel>
现在,您可以在调用服务时获得完整的签名 SOAP 消息。
我希望它可以帮助某人。 :)
【问题讨论】:
-
您要使用哪种签名方式?如果签名是 WS-*,WCF 可能有一个绑定来自动执行此操作。
标签: c# web-services wcf soap ws-security