【问题标题】:How to call a SOAP operation on a specific named WSDL port?如何在特定的命名 WSDL 端口上调用 SOAP 操作?
【发布时间】:2018-07-26 13:32:06
【问题描述】:

以前从 PowerShell 调用 SOAP Web 服务很容易。运行$myProxy = New-WebServiceProxy -Uri 'https://example.com/some/web/service.aspx?wsdl',然后所有操作都神奇地在$myProxy 对象上可用。

但是,我最近同意帮助实现一个快速脚本,它允许我们将数据发送到此处详述的 SII Web 服务:https://www.agenciatributaria.es/AEAT.internet/en_gb/Inicio/Ayuda/Modelos__Procedimientos_y_Servicios/Ayuda_P_G417____IVA__Llevanza_de_libros_registro__SII_/Ayuda_tecnica/Informacion_tecnica_SII/WSDL_de_los_servicios_web/WSDL_de_los_servicios_web.shtml

我要连接的非生产网络服务应该是:https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP(即从上一个链接收到发票)。但是,尝试连接到该 URL 会失败。

我找到了一种解决方法,可以使用 URI 创建代理:https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl。但是,生成的代理并没有给我我期望看到的动作。查看底层 WSDL 似乎指定了多个端口;一些用于生产,另一些用于测试。我想确保我只连接到测试服务。

问题

如何确保我只连接到测试服务?

即对于 WSDL:https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl

...如何确保我只连接到端口SuministroFactEmitidasPruebas

我目前的代码

$uri = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl'
$certificate = Get-Item -Path 'Cert:\CurrentUser\My\ABCDEF1234567890' #i.e. this points to the certificate in my certificate store using the thumbprint of the SII certificate
$proxy = New-WebServiceProxy -Uri $uri 
$proxy.ClientCertificates.Add($certificate)
$proxy.AllowAutoRedirect = $true

这有效并显示了可用的操作,但没有说明我将如何仅选择 TEST (SuministroFactEmitidasPruebas) 端口。

【问题讨论】:

    标签: powershell soap wsdl new-webserviceproxy


    【解决方案1】:

    我认为您可以通过class 属性指定服务的端口:

    $url = "http://www.thing.com/stuff.asmx?wsdl"
    $proxy = New-WebServiceProxy `
      -Uri $url `
      -namespace ... `
      -Class SuministroFactEmitidasPruebas
    

    否则,我认为它会选择第一个端口,但不要引用我的话。希望对您有所帮助。

    【讨论】:

    • 谢谢@Adam。可悲的是,在这种情况下,它不是 Web 服务器的侦听端口。而是 WSDL 端口:<wsdl:port name="SuministroFactEmitidasPruebas" binding="siiWdsl:siiBinding">。请参阅www2.agenciatributaria.gob.es/static_files/common/internet/dep/… 了解上下文
    • 明白了。我见过端口类型在服务中划分功能,但我从未见过提供端口组的单独版本的端口类型。让我改变我的答案。
    • 再次感谢。这适用于端口类型(例如<wsdl:portType name="siiSOAP">),但不适用于端口名称:/。似乎在 C# 中,端口名称将自己表示为端点;即从 WSDL 生成连接的服务,我们看到端口值出现在 EndpointConfiguration 枚举下;例如SuministroFactRecibidas.siiSOAPClient.EndpointConfiguration.SuministroFactEmitidasPruebas
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2019-04-15
    • 2012-08-26
    • 2019-08-18
    相关资源
    最近更新 更多