2010-08-07 8 views
1

J'ai créé un service Web, qui peut une méthode pour définir les informations d'identification utilisateur en utilisant Microsoft.Web.Services3.WebServicesClientProtocol. L'exemple de code est:erreur de service Web 'il n'a pas un constructeur sans paramètre'

<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 cannot be serialized because it does not have a parameterless constructor."

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

+0

Salut! Bienvenue à StackOverflow! Si vous souhaitez mettre en forme vos messages afin qu'ils soient plus lisibles et plus susceptibles de recevoir une réponse, veuillez lire le [StackOverflow Markup Guide] (http://stackoverflow.com/editing-help). Bonne chance avec votre question! –

+0

Je suppose que pour initialiser ou créer une nouvelle variable de type UserCred, vous devez envoyer quelque chose avec le constructeur New(). IE, Dim myCreds comme nouveau userCred (param1, param2). Puisque je ne sais pas avec certitude, je ne publie pas cela comme une réponse, mais je commencerais là. – Tommy

Répondre

2

La racine du problème ici est que la classe Microsoft.Web.Services3.Security.Tokens.UsernameToken n'a pas de constructeur sans paramètre. Il en a 3, mais ils exigent tous un paramètre. UsernameToken constructors on 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 n'a pas de constructeur sans paramètre.

J'ai l'impression que vous ne pouvez pas faire grand-chose pour contourner ce problème. Je suggère seulement de créer une classe partielle, et d'implémenter ce constructeur de zéro-param vous-même.

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

Puisque UsernameToken est défini dans un assembly référencé, je ne pense pas que vous pouvez ajouter un constructeur en utilisant une définition de classe partielle ... Je pense que cela ne fonctionne que lorsque vous avez le code source pour toutes les parties de la classe. –

+0

@Richard: Je pensais autant. C'était un long tir. –

0

p. campbell a raison, c'est parce que XmlSerializer nécessite un constructeur sans paramètre. Je ne sais pas WSE, mais en regardant this post sur Aleem's Weblog, je ne pense pas que le nom d'utilisateur est supposé être passé comme un argument régulier à une méthode web - il est censé être passé dans le WS- En-têtes de sécurité SOAP. Vous obtenez le proxy pour le transmettre dans les en-têtes en appelant le 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) 
0

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éez une classe contenant uniquement les données dont vous avez besoin pour créer un UsernameToken et l'utiliser comme type de paramètre. Le côté client ne créerait pas un vrai objet UsernameToken de toute façon, il y a une classe proxy créée à partir des informations WSDL.

Questions connexes