zoukankan      html  css  js  c++  java
  • 在使用 .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

  • 相关阅读:
    聊聊ES6中的generator
    generator-yield到底是个啥
    jquery 常用方法中那些我不知道的事
    jquery 获取textarea文本值详解
    数组去重
    五指棋人机大战之ai篇
    五指棋人机大战之ui篇
    css控制背景图像不随滚动条的滚动而滚动
    用canvas画会旋转的伞
    CSS3 实现太极图案
  • 原文地址:https://www.cnblogs.com/axinno1/p/14955292.html
Copyright © 2011-2022 走看看