WSDL4J не удалось проанализировать ответ службы wcf .net с помощью Basichttpbinding - PullRequest
0 голосов
/ 18 мая 2011

Я пытаюсь вызвать службу .net wcf из кода JAVA (WSDL4J).Но WSDL4J не удалось разобрать ответ службы .net.Я использовал протокол basichttpbinding.

Фактический ответ от службы -----

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <TestResponse xmlns="http://tempuri.org/">
         <TestResult>hi Test</TestResult>
      </TestResponse>
   </s:Body>
</s:Envelope>

Я сделал еще один анализ этого и обнаружил, что WSDL4j работает нормально, если ответ такой -

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <t:TestResponse xmlnst:t="http://tempuri.org/">
         <TestResult>hi Test</TestResult>
      </TestResponse>
   </s:Body>
</s:Envelope>

Я имею в виду, что WSDL4J правильно анализирует ответ .net, если заданы xml namespase.

Итак, вопрос - как мы можем изменить ответ .net для получения нового ответа xmlили какие изменения мы можем сделать, чтобы часть JAVA могла разобрать ответ сервиса .net ??

1 Ответ

1 голос
/ 18 мая 2011

Основная проблема заключается в том, что WCDL4J, по-видимому, ожидает, что элемент TestResult будет находиться в некотором пространстве по умолчанию или в пустом пространстве имен XML, а не в пространстве имен "http://tempuri.org". Мыло, созданное службой WCF правильно создает элемент TestResponse, чтобы все его дочерние элементы находились в одном и том же пространстве имен XML, и сбрасывает пространство имен XML по умолчанию на «http://tempuri.org".

Парсер WSDL4J, похоже, ожидает, что пространство имен будет применяться только к элементу TestResponse, но не к элементу TestResult. Мне это кажется ошибкой, но, вероятно, вы ничего не можете с этим поделать.

Если вы все еще читаете, есть несколько способов исправить это. Быстрый и простой способ - заставить WCF использовать одно и то же пространство имен XML для всех элементов тела мыла, которые он создает. Для этого следуйте советам в этом сообщении MSDN для пространств имен XML для атрибутов ServiceContract и DataMember для вашей службы. Это может заставить синтаксический анализатор WSDL4J вести себя по-разному, когда он использует ваше пространство имен вместо того, которое используется по умолчанию, но нет гарантии, что это будет работать. Например:

 [ServiceContract(Namespace = "http://YourCo/2011/05/18/YourDomain")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

 [DataContract(Namespace = "http://YourCo/2011/05/18/YourDomain")]
    public class Customer
    {
        [DataMember]
        public string Name {get; set;}
        [DataMember]
        public int ID {get; set;}
    }

Если это не сработает, тогда вам придется воспользоваться подходом , показанным в вопросе и ответе , который гораздо более сложен, но позволяет точно составить мыльное сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...