【问题标题】:How should WSDL be structured?WSDL 应该如何构建?
【发布时间】:2015-04-09 07:31:44
【问题描述】:

由于我是 WSDL、WCF 和 SOAP 的新手,我不知道应该如何构建 WSDL。

我现在的问题是,当用户使用他们的用户名//密码登录时,服务器应该以用户拥有的数据进行响应。假设要发回的数据是:

  • 问题 ID
  • 问题标题
  • 物质文本
  • 事件日期

问题是每个用户可以拥有多个问题,我的问题是我不知道如何解析服务器作为响应发送的第一个 Matter。我的 WSDL 的结构如下:

在:

  • 用户名
  • 密码

输出:

  • int MatterID
  • str MatterTitle
  • str MatterText
  • int 事件日期

我做错了吗?我应该用包含所有数据的列表来回应吗?或者有没有办法循环响应?

【问题讨论】:

    标签: c# asp.net wcf soap wsdl


    【解决方案1】:

    如果要返回一个数据数组,最好在 WSDL(类型部分)中定义一个列表,如下所示:

     <wsdl:types>
        <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost/SampleService" elementFormDefault="unqualified" attributeFormDefault="unqualified">
    
            <s:complexType name="MatterItemType"> <!-- List Item -->
                <s:sequence>
                    <s:element name="MatterID" type="s:integer" minOccurs="1" maxOccurs="1"/>
                    <s:element name="MatterTitle" type="s:string" minOccurs="1" maxOccurs="1"/> 
                    <s:element name="MatterText" type="s:string" minOccurs="1" maxOccurs="1"/>
                    <s:element name="MatterDate" type="s:integer" minOccurs="1" maxOccurs="1"/>                      
                </s:sequence>
            </s:complexType>
    
            <s:complexType name="MatterListType"> <!-- List -->
                <s:sequence>
                    <s:element name="MatterItem" type="tns:MatterItemType" minOccurs="0" maxOccurs="unbounded"/>
                </s:sequence>
            </s:complexType>
    
            <!-- Request and Response -->
    
            <s:element name="SampleRequest">
                    <s:complexType>
                    <s:sequence>           
                        <s:element name="username" type="s:string" minOccurs="1" maxOccurs="1"/>
                        <s:element name="password" type="s:string" minOccurs="1" maxOccurs="1"/>                                
                    </s:sequence>
                </s:complexType>
            </s:element>
    
            <s:element name="SampleResponse">
                <s:complexType>
                    <s:sequence>                    
                        <s:element name="MatterList" type="tns:MatterListType" minOccurs="1" maxOccurs="1"/>            
                    </s:sequence>
                </s:complexType>
            </s:element>    
    
        </s:schema>
    </wsdl:types>   
    

    响应总是包含一个 MatterList 元素,该元素属于 MatterListTypeMatterListType 包含 MatterItemType 中定义的 0 到 N 个 MatterItem 项。

    响应的结构类似于这样(不包括 SOAP 信封、命名空间等,仅用于说明结构):

    <SampleResponse>
        <MatterList>
            <MatterItem>
                <MatterID>1</MatterID>
                <MatterTitle>Title1</MatterTitle>
                <MatterText>Text1</MatterText>
                <MatterDate>1</MatterDate>
            </MatterItem>
            <MatterItem>
                <MatterID>2</MatterID>
                <MatterTitle>Title2</MatterTitle>
                <MatterText>Text2</MatterText>
                <MatterDate>2</MatterDate>
            </MatterItem>
        </MatterList>
    </SampleResponse>
    

    如果您在 cmets 中需要更多帮助,请告诉我。

    【讨论】:

    • 感谢您的回复!当我在一个完全不同的环境“称为 Pyramid 的业务系统”中编写 WSDL 时,我会看看我是否可以用那种语言构造类似的东西。
    • 很高兴我能帮上忙! WSDL 是一个标准,所以如果真的是 WSDL,你应该能够做到这一点。
    • 我真的不明白我应该如何解析列表。这是我的尝试:gist.github.com/jakobmillah/122bf8e6726113dafd87ActivityRow 是服务参考生成的一个类。它包含所有数据,例如:私有字符串 MatterID;私有字符串 MatterTitle; GetUserActivity 2 参数,用户名//密码,应该以列表响应,但我做错了什么。我尝试使用谷歌插件来使用该用户名和密码,并且得到了有效的响应。
    • 我不应该将响应直接解析为 ActivityRow 类。这就是我认为我做错了,但我不知道该怎么做。
    • 这里是假期,所以很抱歉我无法进一步帮助您 - 一直很忙!不管怎样,恭喜你解决了!我在这种情况下使用的工具是 Eclipse。它内部有一个很好的验证工具。当您打开一个 WSDL 时,在您单击文本时在相关菜单中查找 Validate。它将发现大多数结构性问题。使用 SOAP UI 测试服务本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2015-09-23
    相关资源
    最近更新 更多