代码之家  ›  专栏  ›  技术社区  ›  Nick Josevski

.NET 1.1 WSDL-无法将Intptr(windowsIdentity.token)用作WebMethod(asmx Web服务)上的输入参数

  •  0
  • Nick Josevski  · 技术社区  · 17 年前

    对于使用ASMX Web服务的旧WinForms vb.net 1.1应用程序,我们遇到了一个奇怪的情况。正在尝试将WindowsIdentity对象中的用户令牌作为参数发送到WebMethod。我将添加一个“黑客:评论”。

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

    令牌的类型为Intptr,第一个问题是正在生成的WSDL不支持Intptr,错误为“unsupported type”。

    我知道这是一个很大的WTF问题,听起来很不安全,所以欢迎任何简单的有用的替代方案,但是我们如何改变这个系统有很多限制,包括主机环境的复杂性。所以我只想把我们的数据传输到Web服务,以节省很多其他的麻烦。

    问题1

    生成WSDL时出错:

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

    另一种方法(扩展wtf因子)-试图绕过intptr问题的方法是使用

    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”限定被忽略,并被解释为用户服务类的一部分…

    问题2

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

    所以,对任何一个问题或类似的替代方法的答案都是很好的…

    1 回复  |  直到 17 年前
        1
  •  1
  •   JaredPar    17 年前

    如果一个intptr由于缺少对WSDL的支持而无法工作,那么使用long。intptr可以转换为integer和long类型。您可以将该值作为这些类型中的一种传递(最好是长的),然后在另一端将其转换回来。

    转换为长

    Dim value As Long = token.ToInt64()
    

    从长转换

    Dim token as IntPtr = new IntPtr(value)
    

    不过,您应该注意的一点是,令牌只在创建该值的进程的地址空间中有效。如果您通过驻留在另一个进程中的Web服务传递该值,则令牌将没有证明值。它将具有相同的物理地址,但您将无法针对该令牌查询值。