Question

J'ai créé un service web, qui peut une méthode pour définir les informations d'identification utilisateur à l'aide Microsoft.Web.Services3.WebServicesClientProtocol. Le code échantillon est:

<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

Quand je lance le service web, il donne cette erreur:

  

« Microsoft.Web.Services3.Security.Tokens.UsernameToken ne peut pas être sérialisé parce qu'il n'a pas de constructeur sans paramètre. »

Est-ce que quelqu'un sait où est le problème?

Était-ce utile?

La solution

La racine du problème est ici que la Microsoft.Web.Services3.Security.Tokens.UsernameToken de classe n'a pas de constructeur de paramètre moins. Il a obtenu trois d'entre eux, mais ils ont tous demande un paramètre. UsernameToken constructeurs sur MSDN .

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

Le problème est que lors de la désérialisation, XmlSerializer appelle le constructeur sans paramètre pour créer une instance de cette classe. Il ne peut pas désérialiser un type qui ne dispose pas d'un constructeur sans paramètre.

je reçois le sens il n'y a pas grand-chose que vous pouvez faire pour contourner ce problème. Je ne font que suggérer la création d'une classe partielle, et mettre en œuvre ce constructeur zéro vous param.

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

Autres conseils

p. campbell est juste, il est parce que le XmlSerializer a besoin d'un constructeur sans paramètre.

Je ne sais pas WSE, mais de regarder ce poste sur Weblog Aleem, je ne pense pas que le UsernameToken est censé être passé comme argument régulier à une méthode Web - il est censé être passé dans les en-têtes SOAP WS-Security . Vous obtenez le proxy de le transmettre dans les en-têtes en appelant SetClientCredential () . Voici l'exemple du billet de blog ci-dessus:

Dim oService As New WSETestService.ServiceWse

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

Vous ne pouvez pas utiliser un paramètre du type Microsoft.Web.Services3.Security.Tokens.UsernameToken dans un service Web, car il est impossible de serialise (ou plus précisément pas possible de deserialise).

Créer une classe qui contient uniquement les données que vous devez créer un UsernameToken et utiliser comme type de paramètre. Le côté client ne serait pas créer un véritable objet UsernameToken de toute façon, il y a une classe proxy créée à partir des informations WSDL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top