Мы должны подключиться к стороннему сервису SOAP, и мы используем WCF для этого. Сервис был разработан с использованием Apache AXIS, и мы не можем его контролировать и не можем повлиять на его работу.
Проблема, которую мы видим, состоит в том, что она ожидает, что запросы будут отформатированы с использованием безопасности веб-служб, поэтому мы делаем все правильные подписи и т. Д. Однако ответ третьей стороны не защищен. Если мы нюхаем провод, мы видим, что ответ возвращается в порядке (хотя и без отметки времени, подписи и т. Д.).
Базовые компоненты .NET выдают это как ошибку, потому что она видит это как проблему безопасности, поэтому мы фактически не получаем ответ мыла как таковой. Есть ли способ настроить инфраструктуру WCF для отправки защищенных запросов, но не ожидать поля безопасности в ответе? Глядя на спецификации OASIS, не представляется обязательным, чтобы ответы были безопасными.
Для информации вот исключение, которое мы видим:
Исключение, которое мы получаем:
System.ServiceModel.Security.MessageSecurityException was caught
Message="Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties. This can occur if the service is configured for security and the client is not using security."
Source="mscorlib"
StackTrace:
Server stack trace:
at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessageCore(Message& message, TimeSpan timeout)
at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout)
at System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
Между прочим, я видел много сообщений, в которых говорится, что если вы оставите отметку времени, то поля безопасности не ожидаются. Это не вариант - служба, с которой мы общаемся, с отметками времени мандатов.