IMessageSinkとは? わかりやすく解説

IMessageSink インターフェイス

メッセージ シンクインターフェイス定義します

名前空間: System.Runtime.Remoting.Messaging
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

<ComVisibleAttribute(True)> _
Public Interface IMessageSink
[ComVisibleAttribute(true)] 
public interface IMessageSink
[ComVisibleAttribute(true)] 
public interface class IMessageSink
/** @attribute ComVisibleAttribute(true) */ 
public interface IMessageSink
ComVisibleAttribute(true) 
public interface IMessageSink
解説解説

メソッド呼び出しプロキシ実行される場合リモート処理インフラストラクチャは、実際オブジェクトリモート処理境界超えて引数渡したり、その引数指定してそのオブジェクトメソッド呼び出したり、その結果プロキシ オブジェクトクライアント返したりするために必要なサポート提供します

リモートメソッド呼び出しは、クライアント側からサーバー側に送信された後、可能な限りクライアント側返されるメッセージです。リモートメソッド呼び出しは、途中でリモート処理境界超える場合には、IMessageSink オブジェクトチェイン通じて渡すことができますチェイン内のシンクは、メッセージ オブジェクト受信し特定の操作実行してから、チェイン内の次のシンクに処理を任せますプロキシ オブジェクトには、チェイン開始するために必要な最初IMessageSink への参照格納されます。

非同期呼び出しでは、各シンク次のシンクに処理を任せるときに、応答シンク (別の IMessageSink) を提供します。この応答シンクは、応答返されるときに該当する次のシンクによって呼び出されます。

異なる型のシンクは、受信したメッセージ オブジェクトの型に応じて異な操作実行します。たとえば、ロック取得発生させたり、セキュリティ呼び出し強制したり、フロー呼び出し制御信頼サービス実行したり、異なAppDomain別のプロセス別のコンピュータ呼び出し転送したりするなど、シンクによって実行される操作はさまざまです。チェイン内の複数メッセージ シンクが、特定のアクションに関して相互に対話できます

実装時の注意 同期呼び出し非同期呼び出し変換したり、その逆に変換したりすることが可能であるため、このインターフェイス実装するコードは、SyncProcessMessage と AsyncProcessMessage の両方実装提供する必要がありますシンク非同期処理サポートしてない場合でも、これらの両メソッド実装する必要があります

使用例使用例
Imports System
Imports System.Collections
Imports System.Threading
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Imports System.Runtime.Remoting.Proxies
Imports System.Runtime.Remoting.Messaging
Imports System.Security.Permissions
Imports Share


Namespace MyNameSpace

   Public Class MyProxy
      Inherits RealProxy
      Private myUrl As String
      Private myObjectURI As String
      Private myMessageSink As IMessageSink

      <PermissionSet(SecurityAction.LinkDemand)> _
      Public Sub New(myType
 As Type, myUrl1 As String)
         MyBase.New(myType)

         myUrl = myUrl1

         Dim myRegisteredChannels As IChannel()
 = ChannelServices.RegisteredChannels

         Dim channel As IChannel
         For Each channel In
  myRegisteredChannels
            If TypeOf channel Is
 IChannelSender Then
               Dim myChannelSender As IChannelSender
 = CType(channel, IChannelSender)

               myMessageSink = myChannelSender.CreateMessageSink(myUrl, Nothing,
 myObjectURI)
               If Not (myMessageSink Is
 Nothing) Then
                  Exit For
               End If
            End If
         Next channel
         If myMessageSink Is Nothing
 Then
            Throw New Exception("A
 supported channel could not be found for myUrl1:" + myUrl)
         End If
      End Sub 'New

      <SecurityPermission(SecurityAction.LinkDemand, Flags := SecurityPermissionFlag.Infrastructure)>
 _
      Public Overrides Function
 Invoke(ByVal myMesg As IMessage) As
 IMessage
         Console.WriteLine("MyProxy.Invoke Start")

         If TypeOf myMesg Is
 IMethodCallMessage Then
            Console.WriteLine("IMethodCallMessage")
         End If
         If TypeOf myMesg Is
 IMethodReturnMessage Then
            Console.WriteLine("IMethodReturnMessage")
         End If

         Console.WriteLine("Message Properties")
         Dim myDictionary As IDictionary =
 myMesg.Properties
         Dim myEnum As IDictionaryEnumerator
 = CType(myDictionary.GetEnumerator(), IDictionaryEnumerator)

         While myEnum.MoveNext()
            Dim myKey As Object
 = myEnum.Key
            Dim myKeyName As String
 = myKey.ToString()
            Dim myValue As Object
 = myEnum.Value

            Console.WriteLine( "{0} : {1}", myKeyName,
 myEnum.Value)
            If myKeyName = "__Args"
 Then
               Dim myArgs As Object()
 = CType(myValue, Object())
               Dim myInt As Integer
               For myInt = 0 To myArgs.Length
 - 1
                  Console.WriteLine(  "arg: {0} myValue: {1}",
 myInt, myArgs(myInt))
               Next myInt
            End If
            If myKeyName = "__MethodSignature"
 And Not (myValue Is Nothing)
 Then
               Dim myArgs As Object()
 = CType(myValue, Object())
               Dim myInt As Integer
               For myInt = 0 To myArgs.Length
 - 1
                  Console.WriteLine("arg: {0} myValue: {1}",
 myInt, myArgs(myInt))
               Next myInt
            End If
         End While

         Console.WriteLine("myUrl1 {0} object URI{1}",
 myUrl, myObjectURI)

         myDictionary("__Uri") = myUrl
         Console.WriteLine("URI {0}", myDictionary("__URI"))

         Dim myRetMsg As IMessage = myMessageSink.SyncProcessMessage(myMesg)

         If TypeOf (myRetMsg) Is
 IMethodReturnMessage Then
            Dim myMethodReturnMessage As IMethodReturnMessage
 = CType(myRetMsg, IMethodReturnMessage)
         End If

         Console.WriteLine("MyProxy.Invoke - Finish")
         Return myRetMsg
      End Function 'Invoke
   End Class 'MyProxy

   '
   ' Main class that drives the whole sample
   '
   Public Class ProxySample
      <PermissionSet(SecurityAction.LinkDemand)> _
      Public Shared Sub
 Main()
         ChannelServices.RegisterChannel(New HttpChannel())

         Console.WriteLine("Remoting Sample:")

         Console.WriteLine("Generate a new MyProxy using the Type")
         Dim myType As Type = GetType(MyHelloService)
         Dim myUrl1 As String
 = "http://localhost/myServiceAccess.soap"
         Dim myProxy As New
 MyProxy(myType, myUrl1)

         Console.WriteLine("Obtain the transparent proxy from
 myProxy")
         Dim myService As MyHelloService =
 CType(myProxy.GetTransparentProxy(), MyHelloService)

         Console.WriteLine("Calling the Proxy")
         Dim myReturnString As String
 = myService.myFunction("bill")

         Console.WriteLine("Checking result : {0}",
 myReturnString)

         If myReturnString = "Hi there bill,
 you are using .NET Remoting" Then
            Console.WriteLine("myService.HelloMethod PASSED :
 returned {0}", myReturnString)
         Else
            Console.WriteLine("myService.HelloMethod FAILED :
 returned {0}", myReturnString)
         End If
      End Sub 'Main
   End Class 'ProxySample
End Namespace 'MyNameSpace
using System;
using System.Collections;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Security.Permissions;
using Share;    

namespace MyNameSpace
{
   
   public class MyProxy : RealProxy
   {
      string myUrl;
      string myObjectURI;
      IMessageSink myMessageSink;

      [PermissionSet(SecurityAction.LinkDemand)]
      public MyProxy(Type myType, string myUrl1)
         : base(myType)
      {
         
         myUrl = myUrl1;

         IChannel[] myRegisteredChannels = ChannelServices.RegisteredChannels;
         foreach (IChannel channel in myRegisteredChannels
 )
         {
            if (channel is IChannelSender)
            {
               IChannelSender myChannelSender = (IChannelSender)channel;

               myMessageSink = myChannelSender.CreateMessageSink(myUrl, null,
 out myObjectURI);
               if (myMessageSink != null)
                  break;
            }
         }

         if (myMessageSink == null)
         {
            throw new Exception("A supported channel could
 not be found for myUrl1:"+ myUrl);
         }
      }

      [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
      public override IMessage Invoke(IMessage myMesg)
      {
         Console.WriteLine("MyProxy.Invoke Start");

         if (myMesg is IMethodCallMessage)
            Console.WriteLine("IMethodCallMessage");

         if (myMesg is IMethodReturnMessage)
            Console.WriteLine("IMethodReturnMessage");

         Console.WriteLine("Message Properties");
         IDictionary myDictionary = myMesg.Properties;
         IDictionaryEnumerator myEnum = (IDictionaryEnumerator) myDictionary.GetEnumerator();

         while (myEnum.MoveNext())
         {
            object myKey = myEnum.Key;
            string myKeyName = myKey.ToString();
            object myValue = myEnum.Value;

            Console.WriteLine("{0} : {1}", myKeyName, myEnum.Value);
            if (myKeyName == "__Args")
            {
               object[] myArgs = (object[])myValue;
               for (int myInt = 0; myInt <
 myArgs.Length; myInt++)
                  Console.WriteLine("arg: {0} myValue: {1}", myInt, myArgs[myInt]);
            }

            if ((myKeyName == "__MethodSignature") &&
 (null != myValue))
            {
               object[] myArgs = (object[])myValue;
               for (int myInt = 0; myInt <
 myArgs.Length; myInt++)
                  Console.WriteLine("arg: {0} myValue: {1}", myInt, myArgs[myInt]);
            }
         }

         Console.WriteLine("myUrl1 {0} object URI{1}",myUrl,myObjectURI);

         myDictionary["__Uri"] = myUrl;
         Console.WriteLine("URI {0}", myDictionary["__URI"]);
         IMessage myRetMsg = myMessageSink.SyncProcessMessage(myMesg);

         if (myRetMsg is IMethodReturnMessage)
         {
            IMethodReturnMessage myMethodReturnMessage = (IMethodReturnMessage)myRetMsg;
         }

         Console.WriteLine("MyProxy.Invoke - Finish");
         return myRetMsg;
      }
   }

   //
   // Main class that drives the whole sample
   //
   public class ProxySample
   {
      [PermissionSet(SecurityAction.LinkDemand)]
      public static void
 Main()
      {
         ChannelServices.RegisterChannel(new HttpChannel());

         Console.WriteLine("Remoting Sample:");

         Console.WriteLine("Generate a new MyProxy using
 the Type");
         Type myType = typeof(MyHelloService);
         string myUrl1 = "http://localhost/myServiceAccess.soap";
         MyProxy myProxy = new MyProxy(myType, myUrl1);

         Console.WriteLine("Obtain the transparent proxy from myProxy");
         MyHelloService myService = (MyHelloService)myProxy.GetTransparentProxy();

         Console.WriteLine("Calling the Proxy");
         string myReturnString = myService.myFunction("bill");

         Console.WriteLine("Checking result : {0}", myReturnString);

         if (myReturnString == "Hi there bill, you are using
 .NET Remoting")
         {
            Console.WriteLine("myService.HelloMethod PASSED : returned {0}",
 myReturnString);
         }
         else
         {
            Console.WriteLine("myService.HelloMethod FAILED : returned {0}",
 myReturnString);
         }
      }
   }
}

プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
IMessageSink メンバ
System.Runtime.Remoting.Messaging 名前空間

IMessageSink プロパティ


IMessageSink メソッド


パブリック メソッドパブリック メソッド

  名前 説明
パブリック メソッド AsyncProcessMessage 指定したメッセージ非同期的に処理します
パブリック メソッド SyncProcessMessage 指定したメッセージ同期的処理します
参照参照

関連項目

IMessageSink インターフェイス
System.Runtime.Remoting.Messaging 名前空間

IMessageSink メンバ




英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「IMessageSink」の関連用語

IMessageSinkのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



IMessageSinkのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS