Мне нужна помощь для использования веб-службы с использованием SOAP.Мое приложение использует .NET 4.0.
Запрос SOAP должен соответствовать следующим требованиям:
Я должен использовать два разных сертификата для шифрования и подписи.
Конфигурация WCF должна быть настраиваемой (подпись может быть деактивирована).Поэтому привязки должны быть созданы в коде c #, а не в app.config.
Пример запроса, ожидаемого сервером:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-C6D119F21B41F79DBF154885449980234">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="s" />
</ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#id-5">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue>
<ds:KeyInfo Id="KI-C6D119F21B41F79DBF154885449979232">
<wsse:SecurityTokenReference wsu:Id="STR-C6D119F21B41F79DBF154885449979233">
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=..,O=...,C=..</ds:X509IssuerName>
<ds:X509SerialNumber>...</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</s:Header>
<s:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-5">
...
</s:Body>
</s:Envelope>
Моя первая попытка состояла в том, чтобы сгенерировать и отправить запрос с использованием WCF, но я не выяснил, как сгенерировать что-либо в соответствии с требованием.Затем я пытаюсь сгенерировать подпись вручную и использую IClientMessageFormatter и IEndpointBehavior для создания заголовка вручную.Это решение не сработало, потому что WCF применяет процедуры (переключение атрибутов xml и пространств имен ...), которые делают недействительной подпись.Моя последняя попытка состояла в том, чтобы полностью удалить WCF и отправить запрос вручную, но HttpClient недоступен в .NET 4.0, и я не узнал, как отправить запрос TLS без него.
Может кто-нибудь сказать мне, как настроить WCF для генерации правильного SOAP-запроса?Если запрос не может быть создан с помощью WCF, как я могу отправить запрос TLS (и обработать ответ) с помощью .NET 4.0?
Спасибо.