WCF Webservices и FaultContract - клиент получает SoapExc вместо FaultException <TDetails> - PullRequest
0 голосов
/ 15 апреля 2010

Я занимаюсь разработкой веб-сервиса WCF и использую его в приложении mvc2. Моя проблема в том, что я использую FaultContracts в моих методах с пользовательским FaultDetail и вручную генерирую faultexception, но когда клиент получает исключение, он получает обычное SoapException вместо моего FaultException, которое я выбросил со стороны службы.

Вот код:

Пользовательский класс сведений о неисправности:

[DataContract]
public class MyFaultDetails
{
[DataMember]
public string Message { get; set; }
}

Операция по договору на обслуживание:

[OperationContract]
[FaultContract(typeof(MyFaultDetails))]
void ThrowException();

Реализация:

public void ThrowException()
{
var details = new MyFaultDetails { Message = "Exception Test" };
throw new FaultException<MyFaultDetails >(details , new FaultReason(details .Message), new FaultCode("MyFault"));
}

Клиентская сторона:

try
{
// Obv proxy init etc..
service.ThrowException();
}
catch (FaultException<MyFaultDetails> ex)
{
// stuff
}
catch (Exception ex)
{
// stuff
}

Я ожидаю перехватить FaultException, вместо этого этот перехват пропускается, а следующий перехват выполняется с исключением типа SoapException.

Я что-то упустил?

Я много читал об использовании контрактов с ошибками в wcf, и то, что я сделал, кажется хорошим. Я посмотрел на сгенерированные wsdl и xsd, и они выглядят хорошо. Вот фрагмент этого метода:

 <wsdl:operation name="ThrowException">
      <wsdl:input wsaw:Action="http://tempuri.org/IAnyJobService/ThrowException" message="tns:IAnyJobService_ThrowException_InputMessage" />
      <wsdl:output wsaw:Action="http://tempuri.org/IAnyJobService/ThrowExceptionResponse" message="tns:IAnyJobService_ThrowException_OutputMessage" />
      <wsdl:fault wsaw:Action="http://tempuri.org/IAnyJobService/ThrowExceptionMyFaultDetailsFault" name="MyFaultDetailsFault" message="tns:IAnyJobService_ThrowException_MyFaultDetailsFault_FaultMessage" />
    </wsdl:operation>

<wsdl:operation name="ThrowException">
      <soap:operation soapAction="http://tempuri.org/IAnyJobService/ThrowException" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
      <wsdl:fault name="MyFaultDetailsFault">
        <soap:fault use="literal" name="MyFaultDetailsFault" namespace="" />
      </wsdl:fault>
    </wsdl:operation>

Любая помощь?

Заранее спасибо

Привет

Alessandro

1 Ответ

3 голосов
/ 15 апреля 2010

Ок, ребята, решил сам. Как я уже сказал, все было правильно ... я просто использовал неправильный httpBinding (основной, а не ws). Если вы не используете wsHttpBinding, весь красивый механизм FaultContract просто не работает.

Спасибо всем

Привет

Alessandro

...