.NET 1.1 WSDL - Impossible d'utiliser IntPtr (WindowsIdentity.Token) comme paramètre d'entrée sur WebMethod (service Web ASMX)

StackOverflow https://stackoverflow.com/questions/1047386

Question

Nous nous trouvons dans une situation étrange avec une application VB.NET 1.1 héritée winforms utilisant les services Web ASMX. Essayer d'envoyer un jeton d'utilisateur à partir d'un objet WindowsIdentity en tant que paramètre à un WebMethod. Je vais ajouter un commentaire 'HACK:

System.Security.Principal.WindowsIdentity.GetCurrent().Token

Le jeton est de type IntPtr, le premier problème est que le WSDL en cours de génération ne prend pas en charge IntPtr avec l'erreur "type non pris en charge"

Je suis conscient du fait qu’il s’agit d’une grande question WTF et que cela ne semble pas sûr, donc toute alternative simple et utile est la bienvenue, mais il existe de nombreuses contraintes sur la façon dont nous pouvons changer ce système, y compris des complications avec l’environnement d’hébergement. Je souhaite donc simplement que nos données soient transmises au service Web pour éviter de nombreux autres maux de tête.

Problème 1

Erreur de génération WSDL:

Method userClass.TestSendIntPtr can not be reflected. 
--> There was an error reflecting 'token'. 
--> System.IntPtr is an unsupported type.

Une autre approche (extension du facteur WTF) - pour contourner le problème IntPtr, vous devez simplement placer IntPtr dans un System.IO.Stream à l'aide de

.
BinaryFormatter.Serialize()

à la fin de l'application winforms et BF.Deserialize () sur le service. Mais cela conduit à un nouveau problème étrange.

Définition de la signature de la méthode de service Web de cette manière:

Public Class UserService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function UserToken(ByVal tokenStream As System.IO.Stream) As Boolean

Le nouveau problème étrange se produit du côté du client sous forme d’erreur de compilation, comme si la qualification "System.IO" de Stream était ignorée et interprétée comme faisant partie de la classe UserService ...

Problème 2

Value of type 'System.IO.Stream' cannot be converted to 'USERSERVICE.Stream'.

Donc, une réponse à l'une de ces questions ou à une autre approche similaire serait géniale ...

Était-ce utile?

La solution

Si un IntPtr ne fonctionne pas à cause d'un manque de support dans WSDL, utilisez plutôt Long. IntPtr sont convertibles vers et à partir du type Integer et Long. Vous pouvez simplement transmettre la valeur comme l'un de ces types (de préférence Long) et la reconvertir à l'autre bout.

Convertir en long

Dim value As Long = token.ToInt64()

Convertir à partir de long

Dim token as IntPtr = new IntPtr(value)

Il convient toutefois de noter qu'un jeton n'est valide que dans l'espace d'adressage du processus qui a créé la valeur. Si vous transmettez la valeur via un service Web résidant dans un autre processus, le jeton n'aura aucune valeur probante. Il aura la même adresse physique mais vous ne pourrez pas interroger les valeurs par rapport à ce jeton.

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