标签: remoting

异步远程调用

我们有一个远程单独服务器在一个单独的Windows服务中运行(让我们称她的RemotingService).RemotingService的客户端是ASP.NET实例(很多).

目前,客户端远程调用RemotingService并在RemotingService调用被服务时阻塞.但是,远程服务变得越来越复杂(具有更多RPC调用和复杂算法),asp.net工作线程被阻塞了相当长的时间(4-5秒).

根据这篇msdn文章,这样做不会很好地扩展,因为每个远程RPC都阻止了asp.net工作线程.它建议切换到异步处理程序以释放asp.net工作线程.

异步处理程序的目的是释放ASP.NET线程池线程,以便在处理程序处理原始请求时为其他请求提供服务.

这看起来很好,除了远程调用仍然从线程池中占用一个线程.这是与asp.net工作线程相同的线程池吗?

我应该如何将我的远程单例服务器转换为异步系统,以便释放我的asp.net工作线程?

我可能错过了一些重要信息,如果您还有其他任何需要知道的问题,请告诉我.

c# remoting rpc .net-3.5 .net-2.0

9
推荐指数
1
解决办法
2328
查看次数

在.NET远程处理调用期间标识客户端

鉴于此MarshalByRef类:

public class MyRemotedClass : MarshalByRef
{
  public void DoThis()
  {
     ...
  }
  public void DoThat()
  {
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

客户端代码:

MyRemotedClass m = GetSomehowMyRemotedClass();
m.DoThis();
m.DoThat();
Run Code Online (Sandbox Code Playgroud)

我可以让几个客户同时做同样的事情.我想区分客户.如何在远程访问的方法中识别执行远程调用的人员? 例如,我可以记录谁做了什么.(实际上,我不需要追溯真正的客户信息,我只是希望能够对客户进行分组调用.)

[已编辑添加更多背景信息]

我有大量的代码需要覆盖,包括属性.因此,不能选择扩展输入参数列表.

.net remoting multithreading

9
推荐指数
1
解决办法
7147
查看次数

在同一进程中的AppDomain之间发送大字节数组

我正在构建网络服务器并在请求路由到的服务器上启动大量AppDomain.将请求有效负载发送到其中一个AppDomain进行处理的最快方法是什么?

  1. 将有效负载从套接​​字读入字节数组并编组.
  2. 将网络流(继承自MarshalByRef)编组为AppDomain.
  3. 阅读有效载荷.将其解码为对象.元帅解码的对象.
  4. 使用命名管道传输字节数组.
  5. 使用环回套接字.
  6. 也许有一种方法来编组实际的套接字连接?

解码主要创建不可变对象,用于确定如何满足客户端请求,然后AppDomain创建响应并将其编组回主机AppDomain,后者通过套接字将其发回.

该方法应该比较少的CPU更喜欢内存.

WCF不是一个选项.

.net c# windows networking remoting

9
推荐指数
1
解决办法
1553
查看次数

在appdomains中来回传递值

我有以下代码:

    public class AppDomainArgs : MarshalByRefObject {
        public string myString;
    }

    static AppDomainArgs ada = new AppDomainArgs() { myString = "abc" };

    static void Main(string[] args) {
        AppDomain domain = AppDomain.CreateDomain("Domain666");
        domain.DoCallBack(MyNewAppDomainMethod);
        Console.WriteLine(ada.myString);
        Console.ReadKey();
        AppDomain.Unload(domain);
    }

    static void MyNewAppDomainMethod() {
        ada.myString = "working!";
    }
Run Code Online (Sandbox Code Playgroud)

我想这会让我的ada.myString"工作!" 在主appdomain上,但它没有.我认为通过继承MarshalByRefObject,在第二个应用程序域上所做的任何更改也会反映在原始应用程序中(我认为这只是主appdomain上真实对象的代理!)?

谢谢

.net c# vb.net remoting appdomain

9
推荐指数
1
解决办法
8084
查看次数

Assembly.ReflectionOnlyLoadFrom不工作

我有一个Library1.dll包含一些接口的程序集,它们被序列化为数据库中的字节数组.出于某些原因,我们必须更改接口属性和定义.所以现在我正在编写一个迁移实用程序.所以我有2个版本Library1.dll,在我的实用程序中,我创建了一个文件夹,我存储了新版本Library1.dll.这个实用程序反过来也引用Library1.dllbin文件夹包含Library1.dll但是这个dll是在旧版本上编译的.我的新版本Library1.dll存储在一个私有路径中,我传递给Assembly.ReflectionOnlyLoadFrom函数实例化,因此GetTypes在加载的程序集上进一步使我能够进行数据转换.

但是ReflectionTypeLoadException当我试图Library1.dll从私人路径加载时我总是得到.

请帮帮忙!!! 任何帮助,将不胜感激.我真的被卡住了.

谢谢,AG

c# reflection remoting

9
推荐指数
1
解决办法
6102
查看次数

当消息变大时,IpcChannel Remoting会变慢

我正在评估驻留在同一台机器上的几个.NET 2.0进程的各种进程间通信方法.当然,.Net Remoting是候选者,理论上最快的配置应该是IpcChannel(命名管道)+ BinaryFormatter.

我的基准测试确实表明,远程处理IpcChannel可能比TcpChannel更快,但IpcChannel显示吞吐量随着消息变大(大约30 MB)而急剧下降:

Message Size    30 MB       3 MB        300 KB      3 KB
Remoting / TCP  120 MB/s    115.4 MB/s  109.5 MB/s  13.7 MB/s
Remoting / IPC  55 MB/s     223.3 MB/s  218.5 MB/s  20.3 MB/s

有没有人知道为什么,或任何想法如何优化任一渠道的性能?我确实需要传递30 MB的BLOB,并且希望避免必须处理共享内存/内存映射文件.另外,我不能把这些写入磁盘(慢得多).


以下方法用于基准测试(重复调用,测量的总时间,按总时间划分的总有效负载大小).

private byte[] _bytes = null;

public byte[] HelloWorld(long size)
{
    if (_bytes == null || _bytes.Length != size)
        _bytes = new byte[size];
    return _bytes;
}
Run Code Online (Sandbox Code Playgroud)

remoting ipc named-pipes .net-2.0

9
推荐指数
1
解决办法
1731
查看次数

为什么我的C#Remoting对象超时,即使Lifetime返回null?

经过几天的谷歌搜索试图找到我的问题的确切答案后,这是最后的手段.

我创建了一个Windows服务,一个Windows窗体和一个Remoting对象(所有这些都在C#中).我正在使用Remoting对象使用事件在服务和表单之间进行通信.

以下是对象之间典型交互的简化示例:

  • AdminForm调用RemoteObject的方法RequestLoadForm()
  • RemoteObject会触发AdminService正在侦听的事件
  • AdminService会收到有关该事件的警报,并在RemoteObject上调用LoadFormData(字符串数据)
  • RemoteObject会触发AdminForm正在侦听的事件
  • AdminForm会收到有关该事件的警报,并可以使用字符串数据在AdminForm的控件上设置值

这一切都很好,一切都在前5分钟左右完美地相互作用.在那之后,对象之间的连接以某种方式被切断,我不能再在对象之间进行通信.

解决问题的第一个尝试是覆盖InitializeLifetimeService方法以返回null.这没有帮助(虽然它可以避免任何未来的租赁问题).

第二次尝试是创建RemoteObject的AdminFormAdminService ISponsors ,并将它们设置为续订对象的租约.再次,没有解决问题.

在我的各种谷歌搜索中,我发现有人提到有关事件处理程序被垃圾收集的事情.我不确定这是不是问题,但我想我会提到它.

这是连接空闲超过5分钟后弹出的错误:

用户代码未处理System.Runtime.Remoting.RemotingException
消息="未找到请求的服务"
Source ="System.Runtime.Remoting"

现在,关于这一点的奇怪之处在于它发生在AdminService端.该AdminForm呼吁方法RemoteObject的罚款.这会弹出事件,然后AdminService会看到此事件,并尝试调用RemoteObject的方法LoadFormData(字符串数据),这就是抛出异常的地方.

我完全厌倦了谷歌搜索,因为我似乎无法找到我需要修复它.

.net c# events remoting windows-services

9
推荐指数
1
解决办法
8770
查看次数

获取对象的AppDomain

有没有办法确定哪个AppDomain是对象或ObjectHandle实例创建的?

.net c# remoting .net-remoting

9
推荐指数
2
解决办法
2393
查看次数

如何在远程运行命令时更改Powershell CLR版本?

我在尝试在远程服务器上运行我们的一些脚本时遇到了问题.

我们需要所有Powershell会话来加载CLR的v4,因为我们正在使用我们的脚本加载我们自己的自定义二进制文件.

我们已经这样做了一段时间(我们使用类似于这里的修改过的powershell.exe.config这样做:如何使用.NET 4运行时运行PowerShell?),当你进入'Server1'的RDP时一切都很好并开启Powershell会议.变量$ PSVersionTable告诉我们CLR v4已加载.

既然我们正试图通过远程运行这些命令来简化操作,那么我们遇到了问题:当你在同一台服务器上输入一个远程Powershell会话时,$ PSVersionTable只显示v2 ......

所以问题是,如果你在Server1上打开一个本地Powershell会话,它会加载v4,但如果你从Server2远程到Server1它只加载v2.

有谁知道如何告诉Powershell使用CLR v4进行远程会话?任何帮助将非常感激!

clr powershell remoting

9
推荐指数
1
解决办法
6401
查看次数

当您通过.NET Remoting从远程对象返回Stream时,封面下会发生什么

我正Streams从远程服务返回(.NET Remoting).但Streams也是一次性用品,我们都知道这些是待处理的.

Dispose完成消费之后,我可以在客户端打电话.但是,当我Stream从远程对象返回时,我想知道封面下究竟发生了什么.

特别:

  1. 我应该更好地阅读所有内容byte[]并返回而不是一个Stream
  2. 或者.NET远程控制是否完全适合我?
  3. 如果没有,返回Stream与返回不同的是byte[]什么?最后,还是.NET Remoting必须以某种方式序列化数据?
  4. 呼叫Dispose客户端甚至是否有任何影响?客户端对象和服务器端对象之间是否存在神奇的连接?我认为一旦它在封面后反序列化,在呼叫Dispose()客户端或在那里是没有意义的?

我在这里回答Mike Bild,因为我也希望稍微改进一下这个问题

好的,所以回流到服务器的流是(对我来说至少)意想不到的.

为了获取远程对象,必须执行以下操作:

public static class ServiceFactory <T>
{   
    public static T CreateProxy()
    {
        Type interfaceType = typeof(T);

        string uri = ApplicationServer.ServerURL + interfaceType.FullName;

        return (T)Activator.GetObject(interfaceType, uri);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您明确要在某个URI上使用特定的远程对象.当该远程对象上的方法返回一个继承自MarshallByRefObject的对象时,这意味着它自动与远程端的对象相关联?好吧,使用我自己构建的测试对象,这应该很容易重现.所以这也意味着我应该在客户端调用Dispose并将其代理回服务器端的对象?

.net c# remoting dispose .net-remoting

9
推荐指数
1
解决办法
502
查看次数