0

ASMX Web サービスを使用する従来の winforms VB.NET 1.1 アプリケーションで奇妙な状況に陥っています。ユーザー トークンを WindowsIdentity オブジェクトからパラメーターとして WebMethod に送信しようとしています。'HACK: コメントを追加します。

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

トークンのタイプは IntPtr です。最初の問題は、生成される WSDL が「サポートされていないタイプ」のエラーで IntPtr をサポートしていないことです。

これは大きな 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 の問題を回避するには、次を使用して 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

Stream の 'System.IO' 修飾が無視され、UserService クラスの一部として解釈されているかのように、クライアント側でコンパイル エラーとして新しい奇妙な問題が発生します...

問題 2

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

したがって、いずれかの質問への回答、または同様の代替アプローチは素晴らしいでしょう...

4

1 に答える 1

1

WSDL でサポートされていないために IntPtr が機能しない場合は、代わりに Long を使用してください。IntPtr は、Integer 型と Long 型の間で変換可能です。値をこれらの型の 1 つ (できれば Long) として渡し、反対側で元に戻すことができます。

ロングに変換

Dim value As Long = token.ToInt64()

ロングから変換

Dim token as IntPtr = new IntPtr(value)

ただし、トークンは値を作成したプロセスのアドレス空間でのみ有効であることに注意してください。別のプロセスに存在する Web サービスを介して値を渡す場合、トークンには証明値がありません。物理アドレスは同じですが、そのトークンに対して値を照会することはできません。

于 2009-06-26T13:07:44.380 に答える