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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top