Генерируйте детальную ошибку SOAP, если передача имеет неверный заголовок
Я пишу веб-сервис SOAP с использованием WCF. Я хотел бы указать FaultString, если на клиенте отсутствует заголовок безопасности или он неправильно сформирован. В настоящее время это выглядит так при тестировании в SoapUI:
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-US">The creator of this fault did not specify a Reason.</faultstring>
<detail>
<GreetingFault xmlns="http://schemas.datacontract.org/2004/07/SampleService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Message>The message header with name 'Security' and namespace 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' is already present in the set of understood headers.
Parameter name: headerInfo</Message>
</GreetingFault>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
Сгенерированный заголовок безопасности выглядит так:
<soapenv:Header>
<oas:Security>
<!--Optional:-->
<oas:UsernameToken>
<!--Optional:-->
<oas:Username>?</oas:Username>
<!--Optional:-->
<oas:Password Type="?">?</oas:Password>
</oas:UsernameToken>
</oas:Security>
</soapenv:Header>
Мой web.config выглядит так:
<basicHttpBinding>
<binding name="binding1" receiveTimeout="00:05:00" sendTimeout="00:05:00">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="binding1" contract="SampleService.SampleService" name="SampleService.SampleService">
<headers>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>defaultusername</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">defaultpassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</headers>
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="SampleService.SampleServiceBehavior">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="SampleService.Auth, SampleService"/>
<serviceCertificate findValue="localhost" x509FindType="FindBySubjectName"/>
</serviceCredentials>
<ErrorLogging />
</behavior>
</serviceBehaviors>
</behaviors>
У меня также есть IErrorHandler, реализованный в веб-сервисе, но мне нужно сделать еще один шаг и контролировать то, что говорится в FaultString, а также сообщение внутри GreetingFault.
Например, FaultString может сказать: "невозможно проверить заголовок безопасности", а сообщение внутри GreetingFault может сказать: "заголовок безопасности недействителен".
Какой тип исключения мне нужно использовать для детализации этого?