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.