RemotingServices.ExecuteMessage 方法

定义

连接到指定的远程对象,并对其执行提供的 IMethodCallMessage

public:
 static System::Runtime::Remoting::Messaging::IMethodReturnMessage ^ ExecuteMessage(MarshalByRefObject ^ target, System::Runtime::Remoting::Messaging::IMethodCallMessage ^ reqMsg);
public static System.Runtime.Remoting.Messaging.IMethodReturnMessage ExecuteMessage (MarshalByRefObject target, System.Runtime.Remoting.Messaging.IMethodCallMessage reqMsg);
[System.Security.SecurityCritical]
public static System.Runtime.Remoting.Messaging.IMethodReturnMessage ExecuteMessage (MarshalByRefObject target, System.Runtime.Remoting.Messaging.IMethodCallMessage reqMsg);
static member ExecuteMessage : MarshalByRefObject * System.Runtime.Remoting.Messaging.IMethodCallMessage -> System.Runtime.Remoting.Messaging.IMethodReturnMessage
[<System.Security.SecurityCritical>]
static member ExecuteMessage : MarshalByRefObject * System.Runtime.Remoting.Messaging.IMethodCallMessage -> System.Runtime.Remoting.Messaging.IMethodReturnMessage
Public Shared Function ExecuteMessage (target As MarshalByRefObject, reqMsg As IMethodCallMessage) As IMethodReturnMessage

参数

target
MarshalByRefObject

要调用其方法的远程对象。

reqMsg
IMethodCallMessage

指定的远程对象的方法的方法调用消息。

返回

远程方法的响应。

属性

例外

直接调用方没有基础结构权限。

该方法从除对象的本机上下文之外的上下文调用。

示例

下面的代码示例演示如何使用 ExecuteMessage 方法将方法调用转发到远程对象。

[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::LinkDemand, 
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
virtual void ProcessMessageStart( IMessage^ requestMessage, bool /*bClientSide*/, bool /*bAsyncCall*/ )
{
   Console::WriteLine( "\nProcessMessageStart" );
   Console::WriteLine( "requestMessage = {0}", requestMessage );
   try
   {
      Console::WriteLine( "SessionId = {0}.", RemotingServices::GetSessionIdForMethodMessage( dynamic_cast<IMethodMessage^>(requestMessage) ) );
   }
   catch ( InvalidCastException^ ) 
   {
      Console::WriteLine( "The requestMessage is not an IMethodMessage*." );
   }

   IMethodCallMessage^ requestMethodCallMessage;
   try
   {
      requestMethodCallMessage = dynamic_cast<IMethodCallMessage^>(requestMessage);

      // Prints the details of the IMethodCallMessage* to the console.
      Console::WriteLine( "\nMethodCall details" );
      Console::WriteLine( "Uri = {0}", requestMethodCallMessage->Uri );
      Console::WriteLine( "TypeName = {0}", requestMethodCallMessage->TypeName );
      Console::WriteLine( "MethodName = {0}", requestMethodCallMessage->MethodName );
      Console::WriteLine( "ArgCount = {0}", requestMethodCallMessage->ArgCount );
      Console::WriteLine( "MethodCall::Args" );
      IEnumerator^ myEnum = requestMethodCallMessage->Args->GetEnumerator();
      while ( myEnum->MoveNext() )
      {
         Object^ o = safe_cast<Object^>(myEnum->Current);
         Console::WriteLine( "\t {0}", o );

         // Sends this method call message to another server to replicate
         // the call at the second server.
         if ( requestMethodCallMessage->Uri == replicatedServiceUri )
         {
            String^ repSvr = String::Format(  "{0}{1}", const_cast<String^>(replicationServerUrl), const_cast<String^>(replicatedServiceUri) );
            SampleService^ replicationService = dynamic_cast<SampleService^>(Activator::GetObject( SampleService::typeid, repSvr ));
            IMethodReturnMessage^ returnMessage = RemotingServices::ExecuteMessage( replicationService, requestMethodCallMessage );

            // Prints the results of the method call stored in the IMethodReturnMessage*.
            Console::WriteLine( "\nMessage returned by ExecuteMessage." );
            Console::WriteLine( "\tException = {0}", returnMessage->Exception );
            Console::WriteLine( "\tReturnValue = {0}", returnMessage->ReturnValue );
            Console::WriteLine( "\tOutArgCount = {0}", returnMessage->OutArgCount );
            Console::WriteLine( "Return message OutArgs" );
            IEnumerator^ myEnum = requestMethodCallMessage->Args->GetEnumerator();
            while ( myEnum->MoveNext() )
            {
               Object^ o = safe_cast<Object^>(myEnum->Current);
               Console::WriteLine( "\t {0}", o );
            }
         }
      }
   }
   catch ( InvalidCastException^ ) 
   {
      Console::WriteLine( "The requestMessage is not a MethodCall" );
   }
}
public void ProcessMessageStart(IMessage requestMessage, bool bClientSide, bool bAsyncCall) {

   Console.WriteLine("\nProcessMessageStart");
   Console.WriteLine("requestMessage = {0}", requestMessage);

   try {
      Console.WriteLine("SessionId = {0}.",
          RemotingServices.GetSessionIdForMethodMessage((IMethodMessage)requestMessage));
   }
   catch (InvalidCastException) {
      Console.WriteLine("The requestMessage is not an IMethodMessage.");
   }

   IMethodCallMessage requestMethodCallMessage;

   try {
      requestMethodCallMessage = (IMethodCallMessage)requestMessage;
      // Prints the details of the IMethodCallMessage to the console.
      Console.WriteLine("\nMethodCall details");
      Console.WriteLine("Uri = {0}", requestMethodCallMessage.Uri);
      Console.WriteLine("TypeName = {0}", requestMethodCallMessage.TypeName);
      Console.WriteLine("MethodName = {0}", requestMethodCallMessage.MethodName);
      Console.WriteLine("ArgCount = {0}", requestMethodCallMessage.ArgCount);

      Console.WriteLine("MethodCall.Args");
      foreach(object o in requestMethodCallMessage.Args)
          Console.WriteLine("\t{0}", o);

      // Sends this method call message to another server to replicate
      // the call at the second server.
      if (requestMethodCallMessage.Uri == replicatedServiceUri) {

         SampleService replicationService =
            (SampleService)Activator.GetObject(typeof(SampleService),
            replicationServerUrl + replicatedServiceUri);

         IMethodReturnMessage returnMessage =
            RemotingServices.ExecuteMessage(replicationService, requestMethodCallMessage);

         // Prints the results of the method call stored in the IMethodReturnMessage.
         Console.WriteLine("\nMessage returned by ExecuteMessage.");
         Console.WriteLine("\tException = {0}", returnMessage.Exception);
         Console.WriteLine("\tReturnValue = {0}", returnMessage.ReturnValue);
         Console.WriteLine("\tOutArgCount = {0}", returnMessage.OutArgCount);
         Console.WriteLine("Return message OutArgs");

         foreach(object o in requestMethodCallMessage.Args)
            Console.WriteLine("\t{0}", o);
      }
   }
   catch (InvalidCastException) {
       Console.WriteLine("The requestMessage is not a MethodCall");
   }
}
<SecurityPermission(SecurityAction.LinkDemand, Flags := SecurityPermissionFlag.Infrastructure)> _
Public Sub ProcessMessageStart(requestMessage As IMessage, bClientSide As Boolean, bAsyncCall As Boolean) Implements IDynamicMessageSink.ProcessMessageStart

   Console.WriteLine(ControlChars.Cr + "ProcessMessageStart")
   Console.WriteLine("requestMessage = {0}", requestMessage)
   
   Try
      Console.WriteLine("SessionId = {0}.", RemotingServices.GetSessionIdForMethodMessage(CType(requestMessage, IMethodMessage)))
   Catch e As InvalidCastException
      Console.WriteLine("The requestMessage is not an IMethodMessage.")
   End Try
   
   Dim requestMethodCallMessage As IMethodCallMessage
   
   Try
      requestMethodCallMessage = CType(requestMessage, MethodCall)
      
      ' Prints the details of the IMethodCallMessage to the console
      Console.WriteLine(ControlChars.Cr + "MethodCall details")
      Console.WriteLine("Uri = {0}", requestMethodCallMessage.Uri)
      Console.WriteLine("TypeName = {0}", requestMethodCallMessage.TypeName)
      Console.WriteLine("MethodName = {0}", requestMethodCallMessage.MethodName)
      Console.WriteLine("ArgCount = {0}", requestMethodCallMessage.ArgCount)
      Console.WriteLine("MethodCall.Args")
      
      Dim o As Object
      For Each o In  requestMethodCallMessage.Args
         Console.WriteLine(ControlChars.Tab + "{0}", o)
      Next o 
      
      ' Sends this method call message to another server to replicate
      ' the call at the second server
      If requestMethodCallMessage.Uri = replicatedServiceUri Then
         
         Dim replicationService As SampleService = CType(Activator.GetObject(GetType(SampleService), replicationServerUrl + replicatedServiceUri), SampleService)
         Dim returnMessage As IMethodReturnMessage = RemotingServices.ExecuteMessage(replicationService, requestMethodCallMessage)
         
         ' Prints the results of the method call stored in the IMethodReturnMessage.
         Console.WriteLine(ControlChars.Cr + "Message returned by ExecuteMessage.")
         Console.WriteLine(ControlChars.Tab + "Exception = {0}", returnMessage.Exception)
         Console.WriteLine(ControlChars.Tab + "ReturnValue = {0}", returnMessage.ReturnValue)
         Console.WriteLine(ControlChars.Tab + "OutArgCount = {0}", returnMessage.OutArgCount)
         Console.WriteLine("Return message OutArgs")
         For Each o In  requestMethodCallMessage.Args
            Console.WriteLine(ControlChars.Tab + "{0}", o)
         Next o
         
      End If
      
   Catch e As InvalidCastException
      Console.WriteLine("The requestMessage is not a MethodCall")
   End Try

End Sub

注解

服务器在特殊情况下使用当前方法将指定的方法调用转发到另一个对象(可能是远程对象)。 仅当调用方位于适当的上下文中时,才能调用此方法。

适用于