Я реализую веб-сервис WCF, который взаимодействует с клиентом, кодом которого я не управляю. WSDL был предоставлен клиентом.
Я генерировал файлы C# от использования WSDL SvcUtil, и помимо ошибок, обсужденных здесь, у меня не было проблем.
После хостинга сервиса в IIS 7.0 с SSL включил (требуемый клиентом), я попытался заставить клиент выполнять запрос к сервису.
В этой точке я получил следующую ошибку:
The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
Я проверил, что мог использовать метаданные, опубликованные сервисом наряду с SOAPUI для выполнения того же запроса. Это хорошо работало.
Я затем попытался использовать SOAPUI использование WSDL, предоставленного клиентом. Это перестало работать с той же пустой ошибкой действия выше.
Я затем поднял трубку Wireshark (разрешающий дешифрование SSL) и проверил, что сообщение, отправленное от клиента действительно, испытывает недостаток в SOAPAction, таким образом, кажется, что это - определенно проблема.
Поскольку я не могу измениться, клиент является там способом заставить веб-сервис WCF взаимодействовать с таким клиентом? Я предполагаю, что это должно было бы принять запросы без SOAPAction и вместо этого получить желаемый запрос из типа объекта запроса в конверте SOAP?
У меня сработало следующее (на основе этой темы):
ServiceContract
)
XmlSerializerFormat
DispatchByBodyBehavior
Добавьте следующее к вашему интерфейсу сервиса
[OperationContract(Action = "")]
public void DoNothing()
{
}
Для моего сервиса WrapperName и Wrappernamespace являются null
для всех сообщений. Мне пришлось зайти в DispatchByBodyBehaviorAttribute
и отредактировать ApplyDispatchBehavior()
, чтобы добавить следующие строки для проверки этого:
if (qname.IsEmpty) {
qname = new XmlQualifiedName(operationDescription.Messages[0].Body.Parts[0].Name, operationDescription.Messages[0].Body.Parts[0].Namespace);
}