WCF: ошибка FaultContract(typeof(ExceptionDetail))

Я поставил атрибут [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 ответа

Смысл наличия 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....
}

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

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

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

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

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