Pregunta

He creado un servicio web, que puede un método para establecer la credencial de usuario utilizando Microsoft.Web.Services3.WebServicesClientProtocol. El código de ejemplo es:

<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

Al ejecutar el servicio web que da este error:

  

"Microsoft.Web.Services3.Security.Tokens.UsernameToken no puede ser serializado, ya que no tiene un constructor sin parámetros."

¿El Cualquiera sabe dónde está el problema?

¿Fue útil?

Solución

La raíz del problema aquí es que el Microsoft.Web.Services3.Security.Tokens.UsernameToken clase no tiene un constructor sin parámetros. Tiene 3 de ellos, pero todos ellos exigen un parámetro. UsernameToken constructores en MSDN .

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

El problema es que durante la deserialización, XmlSerializer llama al constructor sin parámetros para crear una instancia de esa clase. No puede deserializar un tipo que no tiene un constructor sin parámetros.

Tengo la sensación de que no hay mucho que puede hacer para evitar este problema. Yo sólo sugiero la creación de una clase parcial, y la aplicación de ese cero-param constructor de sí mismo.

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

Otros consejos

p. Campbell es correcto, es debido a que el XmlSerializer requiere un constructor sin parámetros.

No sé WSE, sino de mirar este post el weblog de Aleem, no creo que la UsernameToken se supone que se pasa como un argumento habitual de un método web - se supone que debe ser aprobada en los encabezados SOAP WS-Security . Se obtiene el proxy para pasarlo en las cabeceras llamando SetClientCredential () . Aquí está el ejemplo de la entrada de blog anterior:

Dim oService As New WSETestService.ServiceWse

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

No se puede utilizar un parámetro del tipo Microsoft.Web.Services3.Security.Tokens.UsernameToken en un servicio web, ya que no (no o más específicamente posible deserialise) Es posible serializar.

Crear una clase que solo contiene los datos que necesita para crear un UsernameToken y su uso como tipo de parámetro. El lado del cliente no crearía un objeto UsernameToken real de todos modos, hay una clase de proxy creado a partir de la información WSDL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top