Каково различие между Типом и Элементом в WSDL?

Различие между методами и функциями

Из прочтения этого документа в Microsoft

Члены, содержащие исполняемый код, вместе называются членами-функциями класса. , В предыдущем разделе описаны методы, которые являются основным видом функций-членов. В этом разделе описываются другие виды функций-членов, поддерживаемые C #: конструкторы, свойства, индексаторы, события, операторы и финализаторы.

Таким образом, методы являются подмножеством функций. Каждый метод является функцией, но не каждая функция является методом, например, constructor нельзя сказать как метод , но это функция.

44
задан user3399000 5 August 2015 в 13:27
поделиться

3 ответа

Это еще не все.

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

Также есть неоднозначности. Если вы скажете

<wsdl:message name="message1" type="ns:type1"/>

, значит, вы сказали, что содержимое сообщения должно соответствовать типу «ns: type1». Но вы ничего не сказали об элементе, который содержит контент. В каком пространстве имен он будет?

Обратитесь к базовому профилю WS-I , чтобы узнать о некоторых правилах по этому поводу.


В комментариях было некоторое обсуждение "документ / литерал" и "документ" / буквальный / завернутый ". Вот мое мнение.

Я только что создал веб-сервис. Вот и все:

using System.Web.Services;

namespace WebService1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class SimpleMathService : WebService
    {
        [WebMethod]
        public int Add(int a, int b)
        {
            return a + b;
        }

        [WebMethod]
        public int Multiply(int a, int b)
        {
            return a*b;
        }
    }
}

Я не буду публиковать весь WSDL, но вот «хорошие части»:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" 
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" >
    <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
            <s:element name="Add">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="1" maxOccurs="1" name="a" type="s:int"/>
                        <s:element minOccurs="1" maxOccurs="1" name="b" type="s:int"/>
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="AddResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="1" maxOccurs="1" 
                           name="AddResult" type="s:int"/>
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="int" type="s:int"/>
        </s:schema>
    </wsdl:types>
    <wsdl:message name="AddSoapIn">
        <wsdl:part name="parameters" element="tns:Add"/>
    </wsdl:message>
    <wsdl:message name="AddSoapOut">
        <wsdl:part name="parameters" element="tns:AddResponse"/>
    </wsdl:message>
    <wsdl:portType name="SimpleMathServiceSoap">
        <wsdl:operation name="Add">
            <wsdl:input message="tns:AddSoapIn"/>
            <wsdl:output message="tns:AddSoapOut"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="Add">
            <soap:operation soapAction="http://tempuri.org/Add" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="SimpleMathService">
        <wsdl:port name="SimpleMathServiceSoap" binding="tns:SimpleMathServiceSoap">
            <soap:address location="http://localhost:5305/SimpleMathService.asmx"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Обратите внимание на то, что слово «завернутый» не появляется. То, что IBM в своем документе называет «документ / литерал / завернутый», является просто «документом / литералом», в котором используется одна часть сообщения, имя которой происходит от имени службы, и это относится к к элементу, и который, как оказалось, содержит оба параметра операции.

Здесь нет ничего волшебного, здесь нет ничего нестандартного.

Во многих организациях по стандартизации компании становятся на чью-то сторону. В случае SOAP у нас есть «сторона RPC» и «сторона документа». RPC более знаком многим - он отображает один в один с вызовом функции. Документ менее знаком и требует, чтобы вы действительно думали в терминах простого XML. Возможно, IBM была на стороне RPC, я не знаю.


Я закончил документ IBM, Какой стиль WSDL. Резюме таково:

Резюме

Существует четыре стиля привязки (на самом деле их пять, но документ / кодирование бессмысленно). Хотя у каждого стиля есть свое место, в большинстве ситуаций лучший стиль - это документ / литерал.


Я также хочу реагировать на те места в документе, где обсуждается уровень сложности отправки, в зависимости от того, является ли имя операции присутствует в сообщении. Это не проблема. Если вы прочтете документ, то заметите, что в разделе ничего не обсуждается. Решение проблемы «без имени операции» есть.

<wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Add">
        <soap:operation soapAction="http://tempuri.org/Add" style="document"/>

МылоAction отправляется в HTTP-заголовках запроса и может использоваться для отправки:

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

<?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>
    <Add xmlns="http://tempuri.org/">
      <a>int</a>
      <b>int</b>
    </Add>
  </soap:Body>
</soap:Envelope>
16
ответ дан 26 November 2019 в 22:21
поделиться

Какой из них вы используете, зависит от схемы, на которую он ссылается. Если tns: Person определен в схеме как:

<xs:element name="Person" ... >
 ...
</xs:element>

Тогда вы используете

<wsdl:part name="parameters" element="tns:Person">

Если, с другой стороны, схема определена как

<xs:complexType name="Person">
   ...
</xs:complexType>

, то вы используете

<wsdl:part name="parameters" type="tns:Person">

Итак, вопрос в том, в чем разница между Элементы схемы и типы схемы.

10
ответ дан 26 November 2019 в 22:21
поделиться

Я не могу комментировать WSDL-часть вопроса, но отвечу на часть XML-схемы.

определяет тип, который описывает ] content элемента, без описания самого элемента (то есть его имени). описывает элемент (в частности, его имя), но не его тип. Однако всегда ссылается на тип содержимого элемента, который он описывает. Это может быть ссылка на существующий тип (включая, помимо прочего, - это также может быть, например, ) определение в другом месте в схеме или во встроенном определении:

<xs:element name="foo">
   <xs:complexType>
      ...
   </xs:complexType>
</xs:element>

Поскольку приведенная выше конструкция очень распространена, вы можете полностью опустить , и это будет подразумеваться.

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

2
ответ дан 26 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: