.NET 1.1 WSDL - Impossibile utilizzare IntPtr (WindowsIdentity.Token) come parametro di input su WebMethod (ASMX Web Service)

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

Domanda

Siamo in una strana situazione con un'applicazione VB.NET 1.1 legacy legacy che utilizza i servizi Web ASMX. Tentativo di inviare un token utente da un oggetto WindowsIdentity come parametro a un WebMethod. Aggiungerò un 'HACK: commento.

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

Il token è di tipo IntPtr, il primo problema è che il WSDL generato non supporta IntPtr con l'errore di "tipo non supportato"

Sono consapevole che questa è una grande domanda del WTF e sembra insicura, quindi qualsiasi alternativa utile e semplice è benvenuta, ma ci sono molti vincoli su come possiamo cambiare questo sistema, comprese le complicazioni con l'ambiente di hosting. Quindi vorrei solo portare i nostri dati al servizio web per risparmiare molti altri mal di testa.

Problema 1

Errore dalla generazione WSDL:

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

Un approccio alternativo (che estende il fattore WTF): cercare di aggirare il problema di IntPtr è semplicemente quello di inserire IntPtr in un System.IO.Stream usando

BinaryFormatter.Serialize()

all'estremità dell'app winforms e BF.Deserialize () sul servizio. Ma questo porta a un nuovo strano problema.

Definire la firma del metodo del servizio Web in questo modo:

Public Class UserService
    Inherits System.Web.Services.WebService

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

Il nuovo strano problema si presenta all'estremità del client come un errore di compilazione, come se la qualifica 'System.IO' di Stream fosse ignorata e interpretata come parte della classe UserService ...

Problema 2

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

Quindi una risposta a una domanda o un approccio alternativo simile sarebbe ottima ...

È stato utile?

Soluzione

Se un IntPtr non funziona a causa della mancanza di supporto in WSDL, utilizzare invece Long. IntPtr è convertibile da e verso il tipo intero e lungo. Puoi semplicemente passare il valore come uno di questi tipi (preferibilmente lungo) e riconvertirlo dall'altra parte.

Converti in lungo

Dim value As Long = token.ToInt64()

Converti da lungo

Dim token as IntPtr = new IntPtr(value)

Una cosa che dovresti notare è che un token è valido solo nello spazio degli indirizzi del processo che ha creato il valore. Se si passa il valore attraverso un servizio Web che risiede in un altro processo, il token non avrà alcun valore probatorio. Avrà lo stesso indirizzo fisico ma non sarai in grado di interrogare i valori su quel token.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top