Исключение ошибки WCF не раскрывает детали на клиенте для мыльного сервиса - PullRequest
9 голосов
/ 25 февраля 2011

У нас есть конечные точки REST и SOAP для нашего сервиса, поэтому мы используем WebFaultException для передачи дружественных сообщений. Это прекрасно работает для вызовов REST, а не для вызовов SOAP. Ниже приведен след, который ясно показывает дружественное сообщение в элементе «detail». Но FaultException, которое вызывается на клиенте, имеет описание кода состояния http в сообщении, а не реальное сообщение, выданное службой. Есть ли способ отобразить предполагаемое сообщение на клиенте?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header></s:Header>
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault" xmlns="">a:BadRequest</faultcode>
         <faultstring xml:lang="en-US" xmlns="">Bad Request</faultstring>
         <detail xmlns="">
            <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Country code must be 3 characters.</string>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

Кроме того, это в .net 4.0, и мы используем функцию WCF Касла (DefaultServiceModel и RestServiceModel).

1 Ответ

12 голосов
/ 25 февраля 2011

WCF не будет - по умолчанию и по проекту - не будет сообщать подробную информацию об ошибках по соображениям безопасности. По сути, он только скажет вам, что «что-то пошло не так на сервере - неудача».

Вы можете - для целей разработки и тестирования - включить более подробную информацию об ошибках, но вы должны отключить ее для производства.

Чтобы включить это, используйте служебное поведение на вашем сервере:

<system.serviceModel>
   <behaviors>
      <serviceBehaviors>
         <behavior name="DetailedDebugging">
             <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
      </serviceBehaviors>
   </behaviors>

   <services>
      <service name="YourService"
               behaviorConfiguration="DetailedDebugging" >
          ....
      </service>
   </services>
</system.serviceModel>

Теперь ваша служба должна сообщить подробный сбой SOAP, включая все детали, вплоть до вашего клиентского приложения.

Обновление: если я правильно помню, при обработке стандартного (нетипизированного) FaultException у вас есть легкий доступ к таким вещам, как FaultCode и FaultReason и т. Д., Но к сообщению детали немного обременительны - попробуйте что-то вроде этого:

try
{
   // your service call here
}
catch(FaultException fe)
{
   FaultCode fc = fe.Code;
   FaultReason fr = fe.Reason;

   MessageFault mf = fe.CreateMessageFault();
   if(mf.HasDetail)
   {
      string detailedMessage = mf.GetDetail<string>();
   }
}

Это дает вам доступ к подробному описанию вашей ошибки SOAP ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...