Неверный запрос к службе SOAP не приводит к ожидаемой ошибке SOAP - PullRequest
0 голосов
/ 14 декабря 2018

Я звоню в службу SOAP, работающую в WildFly (JBoss), которая включает в себя эту операцию:

<wsdl:operation name="checkIn">
  <wsdl:documentation>blah</wsdl:documentation>
  <wsdl:input message="tns:checkInRequestMsg" />
  <wsdl:output message="tns:checkInResponseMsg" />
  <wsdl:fault name="error" message="tns:errorMsg" />
</wsdl:operation>

Когда я вызываю эту службу в Fiddler с недопустимым запросом, я получаю ответ HTTP 500, который выглядит по существувот так (я немного отредактировал):

<?xml version="1.0" encoding="utf-16"?>
<SOAP:Envelope xmlns:tns="..." xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP:Body>
      <tns:error version="1.0">
         <reason>...</reason>
      </tns:error>
   </SOAP:Body>
</SOAP:Envelope>

Когда я вызываю эту службу с тем же недопустимым запросом, используя прокси-сервер службы .NET WCF, сгенерированный Visual Studio 2015, я не получаю исключение .NETи ответ нулевой.Я не могу разобрать ответ об ошибке.

Прокси-сервер определяет операцию следующим образом:

    // CODEGEN: Generating message contract since the operation checkIn is neither RPC nor document wrapped.
    [System.ServiceModel.OperationContractAttribute(Action="urn:checkIn", ReplyAction="*")]
    [System.ServiceModel.FaultContractAttribute(typeof(ConsoleApplication2.ServiceReference1.ServiceError), Action="urn:checkIn", Name="error")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    ConsoleApplication2.ServiceReference1.checkInResponse checkIn(ConsoleApplication2.ServiceReference1.checkInRequest request);

Как я могу вызвать службу в .NET, чтобы вместо этого я мог получать проанализированные ответы об ошибкахполучить нулевые ответы?Я хотел бы иметь возможность использовать сгенерированный прокси .NET WCF и избежать необходимости разбора необработанного XML-ответа!

1 Ответ

0 голосов
/ 31 декабря 2018

Я пишу свой код следующим образом и могу перехватить настроенное исключение.

MyServiceContract.

 [ServiceContract]
public  interface Test
{
    [OperationContract]
    [FaultContract(typeof(CalculatorFault))]
    [XmlSerializerFormat(SupportFaults = true)]
    double add(double a, double b);
}

Моя модель исключения.

 [DataContract]
public class CalculatorFault
{
    [DataMember]
    public string OperationName { get; set; }
    [DataMember]
    public string Fault { get; set; }
}

Мой сервис.

 public class ServiceTest : Test
{

    public double add(double a, double b)
    {

        if (b == 0)
        {
            throw new FaultException<CalculatorFault>(new CalculatorFault { OperationName = "divide", Fault = "hello" },"message");
        }
        return a + b;
    }
}

Мой код клиента.

  static void Main(string[] args)
    {
        using (ChannelFactory<Test> testf = new ChannelFactory<Test>("test"))
        {
         Test test =   testf.CreateChannel();
            try
            {
                test.add(0, 0);
            }
            catch (FaultException<CalculatorFault> ex)
            {


            }    
        }
    }
...