情况是这样的。我是一名 Java 开发人员。我们公司的另一位开发人员为我们的客户编写了一个网络服务。他们用 Java 编写服务。他们还编写了一个演示,用于创建客户端以使用 Java 中的 Web 服务,并且运行良好。我的任务是在 VB.NET 中创建一个 Web 服务客户端来做同样的事情。一直不顺利。问题是 Web 服务要求您在 SOAP header 中发送用户名和密码,而我不知道如何在 Vb.NET 中执行此操作。我查看了以下页面:
- http://msdn.microsoft.com/en-us/library/system.servicemodel.httptransportsecurity.aspx
- http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpsecurity.aspx
- http://msdn.microsoft.com/en-us/library/ms553830.aspx
我无法让他们中的任何一个工作。我一直从网络服务中得到“带有用户名和加密密码的 Soap Header 丢失”。我已经尝试了上一个问题中给出的所有建议:
Need to add username and password to SOAP header in VB.NET Web Service Client
我仍然遇到同样的错误。
这是我编写的代码。
Imports System.Net
Imports System.ServiceModel
Public Class RandomQuoteForm
Private Sub GetQuoteButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetQuoteButton.Click
Dim imageService As AverittWebServices.SendWebImageClient = New AverittWebServices.SendWebImageClient("SendWebImagePort")
imageService.ClientCredentials.UserName.UserName = "apriltest11"
imageService.ClientCredentials.UserName.Password = "ew6ttRob1LY+Ik9E5oKlbA=="
Dim imageResult As String
imageResult = imageService.getAvailableImages("")
DisplayLabel.Text = imageResult
End Sub
End Class
这是 WSDL:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions targetNamespace="https://webservices.averittexpress.com/SendWebImageService" name="SendWebImageService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="https://webservices.averittexpress.com/SendWebImageService" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
<xsd:schema>
<xsd:import namespace="https://webservices.averittexpress.com/SendWebImageService" schemaLocation="SendWebImageService_schema1.xsd"/>
</xsd:schema>
</types>
<message name="getDocument">
<part name="parameters" element="tns:getDocument"/>
</message>
<message name="getDocumentResponse">
<part name="parameters" element="tns:getDocumentResponse"/>
</message>
<message name="getAvailableImages">
<part name="parameters" element="tns:getAvailableImages"/>
</message>
<message name="getAvailableImagesResponse">
<part name="parameters" element="tns:getAvailableImagesResponse"/>
</message>
<portType name="SendWebImage">
<operation name="getDocument">
<input message="tns:getDocument"/>
<output message="tns:getDocumentResponse"/>
</operation>
<operation name="getAvailableImages">
<input message="tns:getAvailableImages"/>
<output message="tns:getAvailableImagesResponse"/>
</operation>
</portType>
<binding name="SendWebImagePortBinding" type="tns:SendWebImage">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="getDocument">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="getAvailableImages">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="SendWebImageService">
<port name="SendWebImagePort" binding="tns:SendWebImagePortBinding">
<soap:address location="https://webservices.averittexpress.com/SendWebImageService"/>
</port>
</service>
</definitions>
这是架构:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="https://webservices.averittexpress.com/SendWebImageService" xmlns:tns="https://webservices.averittexpress.com/SendWebImageService" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getAvailableImages" type="tns:getAvailableImages"/>
<xs:element name="getAvailableImagesResponse" type="tns:getAvailableImagesResponse"/>
<xs:element name="getDocument" type="tns:getDocument"/>
<xs:element name="getDocumentResponse" type="tns:getDocumentResponse"/>
<xs:complexType name="getDocument">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
<xs:element name="arg1" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getDocumentResponse">
<xs:sequence>
<xs:element name="return" type="xs:base64Binary" nillable="true" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getAvailableImages">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getAvailableImagesResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我花了整整 3 天的时间来尝试让它发挥作用。我毫不怀疑 VB.NET 开发人员可以在匆忙后解决这个问题。我只是不是那个开发人员,说实话我还有其他我想做的事情。我已经到了愿意尝试一些不同的东西的地步。所以,这是交易。对于第一个使用我可以在我的笔记本电脑(Visual Basic Express Edition 2010)上工作的代码发布这个问题的答案的开发人员以及让它工作所需的任何解释,我将向他们选择的慈善机构捐赠 100 美元。这不是一个改变世界的数字,但我认识的大多数慈善机构都会欣赏这个想法。
用户名必须是“apriltest11”。 加密密码需要为“ew6ttRob1LY+Ik9E5oKlbA==”。 可以传递给 getAvailableImages 方法的有效参数是:0419151598 和 1022600388
WSDL 是公开可用的,用户名/密码组合仅用于测试,所以不要觉得我在这里泄露了王国的 key 。我很想得到一个答案。我不仅能够返回到我的普通 Java 项目,而且在这一点上我真的很想看看这是如何完成的。
设置用户名和密码的Java代码:
URL wsdlLocation = new URL("C:/ .../WEB-INF/wsdl/EncryptedPasswordService.wsdl");
QName qName =new QName("https://webservices.averittexpress.com/EncryptedPasswordService");
EncryptedPasswordService service = new EncryptedPasswordService(wsdlLocation,qName);
EncryptedPassword port = service.getEncryptedPasswordPort();
String encryptedPwd = port.getEncryptedPwd("username", "password");
谢谢。
最佳答案
您的 Java 网络服务是否正确发布了元数据。如果是这样,我相信您可以右键单击 visual studio 解决方案资源管理器并添加 web 引用,这将为您创建代理。
这只有在您使用 Visual Studio 时才能奏效。不知道Java开发者喜不喜欢ot。
关于vb.net - 使用 VB.NET 客户端从 Java Web 服务获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144129/