Генерируйте детальную ошибку 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 может сказать: "заголовок безопасности недействителен".

Какой тип исключения мне нужно использовать для детализации этого?

0 ответов

Другие вопросы по тегам