Web-Service-Fehler ‚es nicht einen parameterlosen Konstruktor haben‘
-
26-09-2019 - |
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?
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.