.NET 1.1 WSDL - 无法上的WebMethod使用的IntPtr(WindowsIdentity.Token)作为输入参数(ASMX Web服务)
-
20-08-2019 - |
题
我们是在与传统之怪现状的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服务传递值,令牌将没有任何证明价值。它将具有相同的物理地址,但你将无法查询值针对令牌。
不隶属于 StackOverflow