.NET 1.1 WSDL - 无法上的WebMethod使用的IntPtr(WindowsIdentity.Token)作为输入参数(ASMX Web服务)

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

我们是在与传统之怪现状的WinForms使用ASMX Web服务VB.NET 1.1应用程序。试图从WindowsIdentity对象发送一个用户令牌作为参数传递给一个WebMethod。我将添加一个“HACK:评论

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

在令牌是类型的IntPtr的,第一个问题是产生不支持的IntPtr与“类型不受支持”

的错误的WSDL

我知道这是一个大问题,跆拳道和声音没有安全感,所以任何简单有用的替代方案是受欢迎的,但也有对我们如何才能改变这种制度,包括与宿主环境复杂很大的制约。所以,我只想让我们的数据块到Web服务,以节省大量的其他烦恼。

<强>问题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()。但是,这会导致一个新的奇怪的问题。

在这种方式定义Web服务方法的签名:

Public Class UserService
    Inherits System.Web.Services.WebService

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

在新的奇怪的问题出现在客户端的编译错误,仿佛流的“System.IO”资格被忽略,不被解释为UserService类的一部分...

<强>问题2

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

所以回答两个问题,或类似的另一种方法将是巨大...

有帮助吗?

解决方案

如果一个IntPtr不会因为缺少在WSDL支持工作,然后用很长代替。 IntPtr的的是转换和从整型和长型。您可以围绕价值只是通过为这些类型的(最好是龙)中的一个,并将其转换回的另一端。

转换为长

Dim value As Long = token.ToInt64()

这龙转换

Dim token as IntPtr = new IntPtr(value)

这是你应该注意到,虽然一件事是一个令牌只有在创造的价值的进程的地址空间中有效。如果您是通过驻留在另一个进程中的Web服务传递值,令牌将没有任何证明价值。它将具有相同的物理地址,但你将无法查询值针对令牌。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top