Die Situation ist wie folgt. Ich bin ein Java-Entwickler. Ein anderer Entwickler in unserem Unternehmen hat einen Webdienst für unsere Kunden geschrieben. Sie haben den Dienst in Java geschrieben. Sie haben auch eine Demo geschrieben, um einen Client zu erstellen, der den Webdienst in Java konsumiert, und es funktioniert einwandfrei. Ich wurde damit beauftragt, einen Webdienst-Client in VB.NET zu erstellen, um das Gleiche zu tun. Das hat nicht reibungslos geklappt. Das Problem ist, dass der Webdienst die Übermittlung des Benutzernamens und des Kennworts im SOAP-Header erfordert, und ich kann nicht herausfinden, wie man das in Vb.NET macht. Ich habe mir die folgenden Seiten angesehen:
- 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
Ich kann keine von ihnen zum Laufen bringen. Ich erhalte immer wieder die Meldung "Soap Header with UserName and encrypted Password is missing" vom Webdienst. Ich habe alle Ratschläge, die in einer früheren Frage gegeben wurden, ausprobiert:
Hinzufügen von Benutzernamen und Passwort zum SOAP-Header in VB.NET Web Service Client
Ich erhalte immer noch die gleiche Fehlermeldung.
Hier ist der Code, den ich geschrieben habe.
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
Hier ist die 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>
Hier ist das Schema:
<?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>
Ich habe über 3 ganze Tage damit verbracht, dies zum Laufen zu bringen. Ich habe keinen Zweifel daran, dass ein VB.NET-Entwickler das Ding in Windeseile rausschmeißen könnte. Ich bin einfach nicht dieser Entwickler und ehrlich gesagt habe ich andere Dinge, an denen ich gerne arbeiten würde. Ich bin an einem Punkt angelangt, an dem ich bereit bin, etwas anderes zu versuchen. Also, hier ist das Angebot. Dem ersten Entwickler, der eine Antwort auf diese Frage mit einem Code liefert, den ich auf meinem Laptop (Visual Basic Express Edition 2010) zum Laufen bringen kann, und der alle nötigen Erklärungen liefert, um ihn zum Laufen zu bringen, werde ich 100 Dollar an eine Wohltätigkeitsorganisation seiner Wahl spenden. Es ist kein weltverändernder Betrag, aber die meisten Wohltätigkeitsorganisationen, die ich kenne, würden den Gedanken zu schätzen wissen.
Der Nutzername muss "apriltest11" lauten. Das verschlüsselte Passwort muss "ew6ttRob1LY+Ik9E5oKlbA==" lauten. Gültige Argumente, die Sie an die Methode getAvailableImages übergeben können, sind: 0419151598 und 1022600388
Die WSDL ist öffentlich zugänglich und die Kombination aus Benutzername und Passwort dient nur zu Testzwecken, also haben Sie nicht das Gefühl, dass ich hier die Schlüssel zum Königreich verschenke. Ich würde sehr gerne eine Antwort auf diese Frage erhalten. Dann könnte ich nicht nur zu meinem normalen Java-Projekt zurückkehren, sondern ich würde auch gerne sehen, wie es gemacht wird.
Java-Code zum Einstellen des Benutzernamens und des Passworts:
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");
Gracias.