【问题标题】:Using a third party web service in vb.net在 vb.net 中使用第三方 Web 服务
【发布时间】:2014-12-19 13:18:20
【问题描述】:

我正在尝试在 VS Pro 2012 (VB.NET) 中构建一个应用程序,该应用程序将调用 RoyalMail 的 MailMark WSDL,该应用程序具有诸如 RetrieveActiveSupplyChains 之类的方法,这些方法需要单个参数(请求)。

我已经使用 svcutil 和 /l:vb 开关来下载 WSDL 并在我的项目中引用它,一旦完成,我就可以看到公开的方法

    Dim client As PosterUploadClient = New PosterUploadClient()

现在输入客户端。调出我希望看到的所有方法,当我执行 client.open() 时,我可以通过身份验证并查看状态变化,但我不知道如何提供实际方法所需的参数。根据他们的文档,RetrieveActiveSupplyChains 不需要参数,但他们提供了请求结构的 xml 示例,所以我的假设是我需要将其构造为具有适当值的 xml 并将其作为“请求”发送?

这听起来对吗?我知道这对于网络程序员来说可能是肉和蔬菜,但我以前没有尝试过。他们作为示例提供的 xml 如下所示:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://rm-manifest.com/2014/01/service/IPosterUpload/RetrieveAllActiveSupplyChains</a:Action>
    <a:MessageID>urn:uuid:ab5e32a3-812e-4d91-97a8-de00a08874e9</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">https://rm-manifest.com/PosterUpload2/PosterUpload.svc/service</a:To>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="_0">
        <u:Created>2014-10-03T14:32:58.480Z</u:Created>
        <u:Expires>2014-10-03T14:37:58.480Z</u:Expires>
      </u:Timestamp>
      <o:UsernameToken u:Id="uuid-dfaaf0b0-3823-4f75-b607-33f7434295dc-1">
        <o:Username>NetworkAccess</o:Username>
        <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">p1</o:Password>
      </o:UsernameToken>
    </o:Security>
  </s:Header>
  <s:Body>
    <RetrieveAllActiveSupplyChains xmlns="http://rm-manifest.com/2014/01/service">
      <request xmlns:b="http://rm-manifest.com/2014/01/messages" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
    </RetrieveAllActiveSupplyChains>
  </s:Body>
</s:Envelope>

但我仍然不确定它实际上需要如何提交,当然如果我使用新的 xmltextreader 阅读该示例,它不喜欢它并显示以下错误消息

Value of type 'System.Xml.XmlTextReader' cannot be converted to 'MM_TEST.Mosaic.EIB.PosterUploadService.Core.Messages.RetrieveActiveSupplyChainsRequest'

我的假设是 WSDL 取代了在我的代码中实际创建“新 HttpRequest”的需要,但不确定。我已经做了很多谷歌搜索,但没有得到任何像这样工作的东西

如果这有帮助,WSDL 就在这里: https://customertest.rm-manifest.com/PosterUpload/PosterUpload.svc

【问题讨论】:

    标签: asp.net xml vb.net wsdl webmethod


    【解决方案1】:

    只需调用方法。提供的 XML 是您调用该方法时 WCF 代理实际发送到服务器的内容。你根本不需要使用它。

    如果您使用 Fiddler 之类的工具,您会发现只需调用 client.RetrieveAllActiveSupplyChains 就会发送一个 HTTP 请求,其正文类似于 XML 示例。

    事实上,RetrieveAllActiveSupplyChains 标记之外的所有内容都与方法无关——它是用于建立和执行与 Web 服务的连接的安全和寻址数据。所有这些都由 WCF 处理。

    【讨论】:

    • 感谢您的回复,那么对于确实需要我发送 SupplyChainID 等参数的方法,语法是什么?尽管如果我只是自己调用该方法,它会说 Argument not specified for parameter 'request' of 'Public Function RetrieveActiveSupplyChains(request As Mosaic.EIB.PosterUploadService.Core.Messages.RetrieveActiveSupplyChainsRequest) As Mosaic.EIB.PosterUploadService.Core.Messages .RetrieveActiveSupplyChainsResponse'
    • 在调用方法时只需将id(我假设是一个整数)作为参数传递。并确保为所有参数提供参数值。错误消息说您根本忘记传递参数。如果参数需要一个对象,则创建该类型的对象并设置其值
    • 然后我得到“整数”类型的值无法转换为“MM_TEST.Mosaic.EIB.PosterUploadService.Core.Messages.RetrieveActiveSupplyChainsRequest”。我认为这是我的问题的症结所在,我知道每个方法“应该”需要哪些参数以及什么格式(字符串、int 等),但所有方法都只接受一个“请求”参数
    • 你所说的参数是这个请求对象的属性
    • 是的,这是有道理的,尽管请求对象可能因方法而异,但我仍然不知道如何使用方法所需的值填充它。例如,CreateBatch() 方法需要 SupplyChainID (string 7)、ManifestID (int) 和 BatchReference (string 50),而 SubmitBatch() 需要 BatchID (int) 和 TotalItemCount(int)。我显然没有得到的一点是我需要创建什么样的对象来保存这些对象,以便我可以将它传递给方法。
    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多