在使用 .NET Remoting 技术开发跨进程通信时Remoting找不到请求的服务--解决方法

System.Runtime.Remoting.RemotingException:“找不到请求的服务”

当出现此异常时,可能的原因有三个:

  1. 要查找的远端对象尚未创建;
  2. 要查找的远端对象已被回收;
  3. 没有使用匹配的方法创建和访问对象

第一种情况:就是当你试图跨进程访问某对象的时候,此对象还没有创建。你需要做的,是控制好对象创建的时机,创建对象的进程需要比访问它的进程更早完成对象的创建和封送。也就是下面的代码需要先调用。

RemotingServices.Marshal(MarshalByRefObject, typeof(TObject).Name);

第二种情况:你可能需要手动处理好封送对象的生命周期。重写 InitializeLifetimeService 方法并返回 null 是一个很偷懒却有效的方法。----我遇到的问题是属于第二种,经过调试发现远程对象被回收了,在一个rpc服务端口对应多个远程对象,其中有四个扩

展的远程对象没有重写MarshalByRefObject类的方法:InitializeLifetimeService,这个方法的重写非常重要,因为这个决定了远程对象的生命周期;

ILease 类型的对象,用于控制此实例的生存期策略。 这是此实例当前的生存期服务对象(如果存在);否则为初始化为 LeaseManagerPollTime 属性的值的新生存期服务对象;

微软官方地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.marshalbyrefobject.initializelifetimeservice?view=net-5.0

//微软官方的例子
public
class MyClass : MarshalByRefObject { [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.Infrastructure)] public override Object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(1); lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); lease.RenewOnCallTime = TimeSpan.FromSeconds(2); } return lease; } }

//我这里直接设置为null,不需要设置生命周期--问题得到解决

namespace testRemote
{
    public abstract class MyRemoteObject : MarshalByRefObject
    {
        public sealed override object InitializeLifetimeService() => null;
    }
}

第三种情况:你需要检查你是如何注册 .NET Remoting 通道的,创建和访问方式必须匹配。

资料参考:

https://www.icode9.com/content-3-529350.html#_39

原文地址:https://www.cnblogs.com/axinno1/p/14955292.html