Frage

Ich habe einen Web-Service erstellt, die eine Methode, um die Anmeldeinformationen Benutzer mit Microsoft.Web.Services3.WebServicesClientProtocol zu setzen. Der Beispielcode ist:

<WebMethod()> _
    Public Sub ClientCredential1(Of TSecurityToken As SecurityToken)_
         (ByVal UserCred As Microsoft.Web.Services3.Security.Tokens.UsernameToken)

        Dim cProxy As New Microsoft.Web.Services3.WebServicesClientProtocol()
        cProxy.SetClientCredential(UserCred)
    End Sub

Wenn ich den Web-Service laufen gibt es diesen Fehler:

  

„Microsoft.Web.Services3.Security.Tokens.UsernameToken kann nicht serialisiert werden, da es nicht einen parameterlosen Konstruktor hat.“

Hat jemand wissen, wo ist das Problem?

War es hilfreich?

Lösung

Die Wurzel des Problems ist, dass die Klasse Microsoft.Web.Services3.Security.Tokens.UsernameToken keinen parameterlose Konstruktor hat. Es ist 3 von ihnen bekam, aber sie alle fordern einen Parameter. Username Konstrukteuren auf MSDN .

  • UsernameToken (XmlElement)
  • UsernameToken (String, String)
  • UsernameToken (String, String, PasswordOption)

Das Problem ist, dass während der Deserialisierung, XmlSerializer den parameterlosen Konstruktor ruft eine Instanz dieser Klasse zu erstellen. Es kann nicht eine Art deserialisieren, die nicht einen parameterlosen Konstruktor hat.

bekomme ich das Gefühl, es gibt nicht viel können Sie, um dieses Problem zu arbeiten. Ich würde nur eine partielle Klasse empfehlen die Erstellung und Implementierung, dass die Null-param Konstruktor selbst.

'ensure namespacing is correct.
Public Partial Class UsernameToken
    Public Sub New()
    End Sub    
End Class

Andere Tipps

p. campbell ist richtig, es ist, weil der XmlSerializer einen parameterlosen Konstruktor erfordert.

Ich weiß nicht, WSE, aber aus der Betrachtung dieser Beitrag auf Aleem Weblog, ich den Usernamen nicht denken soll als reguläres Argument an eine Web-Methode übergeben werden - es sollte in den WS-Security SOAP-Header übergeben werden . Sie erhalten den Proxy es in den Header zu übergeben von SetClientCredential () . Hier ist das Beispiel aus dem obigen Blog-Eintrag:

Dim oService As New WSETestService.ServiceWse

Dim U As New UsernameToken(“<User_Name>”, “<Password>”, PasswordOption.SendHashed)
oService.SetClientCredential(U)

Sie können einen Parameter des Typs Microsoft.Web.Services3.Security.Tokens.UsernameToken in einem Web-Service nutzen, wie es serialise nicht möglich ist (oder genauer gesagt nicht möglich deserialise).

Erstellen Sie eine Klasse, dass nur die Daten enthält, die Sie benötigen einen UsernameToken und Verwendung als Parametertyp zu erstellen. Die Client-Seite würde ein echtes UsernameToken Objekt nicht erstellen wie auch immer, eine Proxy-Klasse aus den WSDL-Informationen erstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top