Мы находимся в странной ситуации с устаревшим приложением 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'.
Так что ответ на любой вопрос или аналогичный альтернативный подход был бы замечательным...