Erro de serviço da web 'ele não possui um construtor sem parâmetros'
-
26-09-2019 - |
Pergunta
Eu criei um serviço da web, que pode um método para definir a credencial do usuário usando Microsoft.Web.Services3.WebServicesClientProtocol
. O código de amostra é:
<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
Quando eu executo o serviço da web, ele dá este erro:
"Microsoft.Web.Services3.Security.Tokens.UsernameToken não pode ser serializado porque não possui um construtor sem parâmetros."
Alguém sabe onde está o problema?
Solução
A raiz do problema aqui é que a classe Microsoft.Web.Services3.Security.Tokens.UsernameToken
Não possui um construtor sem parâmetro. Tem três deles, mas todos exigem um parâmetro. Construtores de UsernameToken no MSDN.
UsernameToken (XmlElement)
UsernameToken (String, String)
UsernameToken (String, String, PasswordOption)
O problema é que, durante a desserialização, o XMLSerializer chama o construtor sem parâmetros para criar uma instância dessa classe. Ele não pode desserializar um tipo que não possui um construtor sem parâmetros.
Sinto a sensação de que não há muito que você possa fazer para contornar esse problema. Eu só sugiro criar uma classe parcial e implementar esse construtor zero-param.
'ensure namespacing is correct.
Public Partial Class UsernameToken
Public Sub New()
End Sub
End Class
Outras dicas
p. Campbell está certo, é porque o XMLSerializer requer um construtor sem parâmetros.
Eu não conheço WSE, mas de olhar para esta postagem No blog de Aleem, não acho que o UserNameToken deve ser aprovado como um argumento regular para um método da Web - ele deve ser aprovado nos cabeçalhos de sabão de segurança do WS. Você tem o proxy para passar nos cabeçalhos ligando SetClientCredential (). Aqui está o exemplo da postagem do blog acima:
Dim oService As New WSETestService.ServiceWse
Dim U As New UsernameToken(“<User_Name>”, “<Password>”, PasswordOption.SendHashed)
oService.SetClientCredential(U)
Você não pode usar um parâmetro do tipo Microsoft.Web.Services3.Security.Tokens.UsernameToken
Em um serviço da Web, pois não é possível serializar (ou mais especificamente não é possível desserializar).
Crie uma classe que contém apenas os dados que você precisa para criar um UsernameToken
e use como tipo de parâmetro. O lado do cliente não criaria um real UsernameToken
Objeto de qualquer maneira, há uma classe proxy criada a partir das informações do WSDL.