Служба WCF, ответ в SOAP или простой XML, как?

Я борюсь с этим несколько часов и не могу найти решение проблемы связи. Мой сервис должен общаться с клиентами через SOAP или простой XML

Моя служба будет написана на основе среды WCF, однако мои клиенты не работают.

Не могли бы вы показать мне шаг за шагом, как изменить код и конфигурацию службы таким образом, что она вернет SOAP или XML-сообщение? Меня интересуют оба решения.

Я попытался добиться этого на основе этих ответов:

Конечные точки REST/SOAP для службы WCF Вызвать WCF с помощью вызова SOAP

Но ни одно из этих решений не работало правильно для меня. Либо я ничего не получил в своем браузере или ошибке, что ресурс не найден.

Итак, я начал новый проект службы WCF. Он работает под http://localhost:3151/ и имеет следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfService1
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

Возможно, мне нужно создать две конечные точки? Оба они должны содержать basicHttpBinding как параметр привязки. Но что еще?

Также, как создать такой XML (на основе контракта данных):

<CompositeType BoolValue = 0 StringValue = "">

вместо этого:

<CompositeType>
  <BoolValue>0</BoolValue>
  <StringValue></StringValue>
</CompositeType>

Обратите внимание, что мне нужно как двухстороннее общение, поэтому моей службе необходимо получить SOAP или XML и ответ в SOAP или XML.

Также, если это возможно, я хотел бы увидеть описание методов службы в моем браузере, как это было в ASP.NET.

Заранее благодарим за ваше время.

Очень большое обновление здесь

Я попытался найти какое-то решение, и вот это все, что я собрал до сих пор. Я сосредоточился только на простом XML.

Давайте скажем, что протокол выглядит следующим образом:

Сообщение от клиента:

<MESSAGE MessageParam1 = 0>
  <AdditionalInfo>Some message info </AdditionalInfo>
</MESSAGE>

Ответ:

<RESPONSE ResponseParam1 = 0>
  <AdditionalInfo>Some response info</AdditionalInfo>
</MESSAGE>

Прежде всего, я хотел бы увидеть описание текущих методов обслуживания, и он будет параметрироваться в точном формате, поскольку они будут отправлены/получены. Я имею в виду, что когда я экспериментировал с ASP.NET 2.0 WebServices при вызове службы в моем браузере (только что начал службу), я получил такой ответ:

POST /Service1.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/ShowUser"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ShowUser xmlns="http://tempuri.org/">
      <MyLogin>
        <User>string</User>
        <Password>string</Password>
        <Database>string</Database>
      </MyLogin>
    </ShowUser>
  </soap:Body>
</soap:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ShowUserResponse xmlns="http://tempuri.org/">
      <ShowUserResult>string</ShowUserResult>
    </ShowUserResponse>
  </soap:Body>
</soap:Envelope>

И это БОЛЬШОЕ. Кроме того, у этого есть SOAP-конверт (базовые данные также разные), но дело в том, что я могу показать его клиенту и сказать ему: "вы используете HTTP POST-метод с такой структурой XML и получаете такой ответ". Я хочу получить аналогичный результат с WCF, но еще проще - без SOAP. Пока, когда я нажимаю на Service1.svc, я получаю кучу кода WSDL, которого я не хочу. Я знаю, что это хорошо для некоторых случаев, но я не знаю, какая платформа использует мой клиент. И если он не будет использовать .NET, то он, вероятно, не будет корректно импортировать WSDL.

Итак, вы знаете, что я хотел бы получить.

Это то, что я сделал до сих пор после двух долгих дней...:

namespace RESTService
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.

    [ServiceContract]
    [XmlSerializerFormat]
    public interface IService
    {
        [OperationContract]
        [WebGet]
        Response EchoWithGet(string s);

        [OperationContract]
        [WebInvoke]
        Response EchoWithPost(string s);
    }

    public class Response
    {
        [XmlAttribute]
        public int ResponseParam1;
        [XmlElement]
        public string AdditionalInfo;
    }
}

Как вы видите, я не предоставлял класс Message, потому что я не знаю, как передать его методу через браузер. Я знаю только, как передать строку.

И вот реализация и конфиг:

namespace RESTService
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class Service1 : IService
    {
        public Response EchoWithGet(string s)
        {
            Response Transaction;
            Transaction = new Response();
            Transaction.AdditionalInfo = "I've responded: " + s;
            return Transaction;
        }
        public Response EchoWithPost(string s)
        {
            Response Transaction;
            Transaction = new Response();
            Transaction.AdditionalInfo = "I've responded: " + s;
            return Transaction;
        }
    }
}

Конфигурация для меня тоже немного загадка. Я попытался создать привязку, как описано в одной из тем из MSDN: http://msdn.microsoft.com/en-us/library/aa395208.aspx

но затем после вызова метода я вернул SOAP-подобную структуру сбоев, но без SOAP-огибающей.

В любом случае, здесь находится config:

<system.serviceModel>
      <services>
         <service name="RESTService.Service1">
           <host>
           </host>
           <endpoint 
               address="rest" behaviorConfiguration="webBehavior"
               bindingConfiguration="" binding="webHttpBinding" 
               contract="RESTService.IService"/>
         </service>
       </services>
       <behaviors>
         <endpointBehaviors>
            <behavior name="webBehavior">
               <webHttp />
            </behavior>
         </endpointBehaviors>
       </behaviors>
</system.serviceModel>

Когда я вызываю метод службы в своем браузере следующим образом:

http://localhost:2443/Service1.svc/rest/EchoWithGet?s=test

Я получил в своем браузере XML файл:

<Response ResponseParam1="0">
<AdditionalInfo>I've responded: test</AdditionalInfo>
</Response>

Итак, похоже, я на правильном пути? Однако все же я не знаю, как получить полную информацию (например, в ASP.NET 2.0) о том, что было отправлено и что было получено. Я бы предпочел не слушать порт службы с помощью sniffer, чтобы посмотреть, что происходит через HTTP. Я бы хотел это увидеть. Кроме того, когда я смотрю на исходный файл полученного XML, я вижу следующее:

<?xml version="1.0" encoding="utf-8"?><Response ResponseParam1="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br/>
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><br/>
<AdditionalInfo>I've responded: test</AdditionalInfo></Response>

Я не хочу иметь эту дополнительную информацию в возвращаемом XML, как это вырезать?

Другая проблема связана со вторым методом:

http://localhost:2443/Service1.svc/rest/EchoWithPost?s=test

Это не работает должным образом. Я получаю сообщение об ошибке, что "метод не разрешен". Как решить эту проблему?

Итак, давайте подведем итог этому длинному вопросу.

У меня есть какое-то полузарабочее решение, которое может быть правильным или неправильным. Я хотел бы попросить вас либо закончить его, чтобы он также мог:

  • Принять в методе XML файл в качестве параметра.
  • Покажите мне, как вызвать метод в веб-браузере с XML в качестве параметра. Да, я не хочу отдельного клиента в .NET. Пусть браузер будет клиентом.
  • Покажите мне, как вырезать ненужную раздутую информацию в возвращаемом XML.
  • Покажите мне, как получить .NET-описание моего сервиса с учетом того, что я не хочу иметь SOAP.
  • Объясните мне, что не так с методом EchoWithPost. Почему это не работает?

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

Я просто изучаю .NET и WCF, и я очень смущен. Все это связано только с настройкой правильного протокола обмена данными... и я даже не стал записывать реальный сервис: |

Большое спасибо за ваше время и любую будущую помощь.

Ответ 1

Сервис, который у вас здесь, , будет возвращать SOAP-сообщение, которое будет содержать "CompositeType" в качестве "полезной нагрузки".

WCF по умолчанию использует SOAP - любая базоваяHttpBinding, wsHttpBinding, netTcpBinding и т.д. все работают с SOAP в качестве основы.

Если вы хотите вернуть прямой XML, вам нужно проверить возможности REST WCF - это работает с webHttpBinding (и только с этим связыванием).

Также, как создать такой XML (на основе контракта данных):

<CompositeType BoolValue = 0 StringValue = "">

вместо этого:

<CompositeType>
  <BoolValue>0</BoolValue>
  <StringValue></StringValue>
</CompositeType>

Это ограничение для сериализатора WCF DataContract. По соображениям производительности он не поддерживает атрибуты, например. вы не можете создать первый фрагмент XML, который вы хотите.

Если вы абсолютно должны иметь первый XML, вам нужно вместо этого использовать XmlSerializer (у которого есть свой собственный набор ограничений/проблем).

Марк

UPDATE: если вы просто хотите вернуть данный XML, то вам, вероятно, будет лучше с помощью подхода REST.

Ознакомьтесь с веб-сайтом Pluralsight для отличной серии скринкастов при использовании REST и, в частности, один скринкаст о том, как создать служба REST для обычного XML (POX).

Ответ 2

Взгляните на Enunciate. Я использовал его раньше, чтобы создать интерфейс REST (XML && JSON), а также интерфейс SOAP. Это может дать вам именно то, что вы ищете, и с ним довольно легко работать. Ведущий разработчик также довольно активен в списке рассылки, поэтому, если у вас есть вопросы, просто отправьте сообщение группе, и вы обычно получите ответ очень быстро.