.NET 1.1 WSDL - невозможно использовать IntPtr (WindowsIdentity.Token) в качестве входного параметра в WebMethod (веб-служба ASMX) - PullRequest
0 голосов
/ 26 июня 2009

Мы находимся в странной ситуации с устаревшим приложением winforms VB.NET 1.1, использующим веб-сервисы ASMX. Попытка отправки токена пользователя из объекта WindowsIdentity в качестве параметра в WebMethod. Я буду добавлять 'HACK: комментарий.

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

Маркер типа IntPtr, первая проблема заключается в том, что генерируемый WSDL не поддерживает IntPtr с ошибкой «неподдерживаемый тип»

Я знаю, что это большой вопрос WTF и звучит небезопасно, поэтому приветствуются любые простые полезные альтернативы, но существует множество ограничений на то, как мы можем изменить эту систему, включая сложности со средой размещения. Поэтому я просто хотел бы передать наш кусок данных в веб-сервис, чтобы избавить от множества других головных болей.

Задача 1

Ошибка из поколения WSDL:

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

Альтернативный подход (расширение коэффициента WTF) - попытка обойти проблему IntPtr - это просто поместить IntPtr в System.IO.Stream, используя

BinaryFormatter.Serialize()

в конце приложения winforms и BF.Deserialize () в службе. Но это приводит к новой странной проблеме.

Определение подписи метода веб-службы следующим образом:

Public Class UserService
    Inherits System.Web.Services.WebService

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

Новая странная проблема возникает на стороне клиента как ошибка компиляции, как если бы квалификация Stream.System.IO игнорировалась и интерпретировалась как часть класса UserService ...

Задача 2

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

Так что ответ на любой вопрос или аналогичный альтернативный подход был бы отличным ...

1 Ответ

1 голос
/ 26 июня 2009

Если IntPtr не будет работать из-за отсутствия поддержки в WSDL, вместо этого используйте Long. IntPtr можно конвертировать в целые и длинные типы. Вы можете просто передать значение как один из этих типов (предпочтительно Long) и преобразовать его обратно на другом конце.

Конвертировать в Long

Dim value As Long = token.ToInt64()

Конвертировать из Long

Dim token as IntPtr = new IntPtr(value)

Однако следует отметить, что токен действителен только в адресном пространстве процесса, создавшего значение. Если вы передаете значение через веб-сервис, который находится в другом процессе, токен не будет иметь доказательственного значения. У него будет тот же физический адрес, но вы не сможете запрашивать значения по этому токену.

...