Я использую веб-службу (Java) из своей собственной веб-службы (WCF). Мне нужно получить подписанный запрос сообщения SOAP (с подписанным заголовком безопасности), который я отправляю в веб-службу Java, и сохранить его (файл, базу данных, ...).
Я пробовал использовать IClientMessageInspector с помощью метода BeforeSendRequest, но запрос еще не подписан. Есть ли способ получить подписанный запрос перед его отправкой?
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var content = request.ToString();
// request is not signed yet
return null;
}
Другой вариант - подписать запрос «вручную» ... Раньше я делал это с помощью класса SoapEnvelope (Microsoft.Web.Services3) с веб-службами .asmx. Я пробовал использовать CustomMessageHeader, но это было невозможно (для меня).
Есть у кого-нибудь идеи?
заранее спасибо
ИЗМЕНИТЬ. Наконец-то я нашел решение, которое мне подходит. Я использовал трассировку WCF. На одном из шагов вы должны отредактировать файл machine.config на клиенте. Это может не сработать для всех
Как: 1. Изменить файл конфигурации для трассировки. Вам необходимо добавить информацию о диагностике и 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>
Создайте класс MyTreceListener, унаследованный от TraceListener
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 при вызове службы.
Надеюсь, это кому-то поможет. :)