WCF: ошибка FaultContract (typeof (ExceptionDetail)) - PullRequest
4 голосов
/ 18 марта 2010

Я поставил атрибут [FaultContract(typeof(ExceptionDetail))] для моего контракта на эксплуатацию. Когда я пытаюсь добавить службу в клиентское приложение, я получаю эту ошибку - "Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details."

Но когда я комментирую атрибут FaultContract, я могу добавить ссылку на службу wcf в моем клиентском приложении.

Ответы [ 4 ]

9 голосов
/ 19 марта 2010

Смысл наличия FaultContracts состоит в том, чтобы в первую очередь обеспечить возможность возврата к сбоям SOAP от службы, которые не будут нарушать канал связи между сервером и клиентом (обработка условий ошибок, таких как исключения .NET, изящно и функционально), и, во-вторых, используя FaultContracts, ваш сервер может выбросить типичные ошибки (FaultException<T>), и ваш клиент может их перехватить.

Если вы хотите или должны быть действительно совместимыми, вам необходимо:

  • определить все ваши типы FaultContract как классы, украшенные атрибутом [DataContract]
  • перехватывает все исключения .NET на сервере (например, через интерфейс IErrorHandler) и превращает их в совместимые ошибки SOAP

Если вы контролируете оба конца провода и оба конца .NET, то вы можете упростить это за один шаг: на сервере обработайте все исключения .NET и превратите их, например, в. FaultException<ArgumentOutOfRangeException>, то есть создайте «ошибку (независимо от исключения .NET)», а затем на клиенте перехватите эти напечатанные исключения FaultException и обработайте их:

[FaultContract(typeof(ArgumentOutOfRangeException)]
[OperationContract]
public void CallService(.......)

и затем в своей реализации используйте это:

try
{
    clientProxy.CallService();
}
catch(FaultException<ArgumentOutOfRangeException> ex)
{
   // handle the most specific exception first
}
catch(FaultException ex)
{
   // handle all other, unspecific server faults
}
catch(CommunicationException ex)
{
   // handle all other, client-proxy related WCF errors
}
catch(Exception ex)
{
   // handle anything else....
}
2 голосов
/ 18 марта 2010

Удалите это FaultContract и вместо этого настройте includeExceptionDetailInFaults:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
0 голосов
/ 15 февраля 2011

У меня была такая же проблема несколько минут назад. Это было связано с отсутствием конструктора по умолчанию. Также помните, что все свойства должны иметь открытые методы доступа get / set.

0 голосов
/ 18 марта 2010

Используйте инструмент Просмотр трассировки служб из http://msdn.microsoft.com/en-us/library/ms732023.aspx, для просмотра трассировки активности.

...