我们有一个远程单独服务器在一个单独的Windows服务中运行(让我们称她的RemotingService).RemotingService的客户端是ASP.NET实例(很多).
目前,客户端远程调用RemotingService并在RemotingService调用被服务时阻塞.但是,远程服务变得越来越复杂(具有更多RPC调用和复杂算法),asp.net工作线程被阻塞了相当长的时间(4-5秒).
根据这篇msdn文章,这样做不会很好地扩展,因为每个远程RPC都阻止了asp.net工作线程.它建议切换到异步处理程序以释放asp.net工作线程.
异步处理程序的目的是释放ASP.NET线程池线程,以便在处理程序处理原始请求时为其他请求提供服务.
这看起来很好,除了远程调用仍然从线程池中占用一个线程.这是与asp.net工作线程相同的线程池吗?
我应该如何将我的远程单例服务器转换为异步系统,以便释放我的asp.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)
我可以让几个客户同时做同样的事情.我想区分客户.如何在远程访问的方法中识别执行远程调用的人员? 例如,我可以记录谁做了什么.(实际上,我不需要追溯真正的客户信息,我只是希望能够对客户进行分组调用.)
[已编辑添加更多背景信息]
我有大量的代码需要覆盖,包括属性.因此,不能选择扩展输入参数列表.
我正在构建网络服务器并在请求路由到的服务器上启动大量AppDomain.将请求有效负载发送到其中一个AppDomain进行处理的最快方法是什么?
解码主要创建不可变对象,用于确定如何满足客户端请求,然后AppDomain创建响应并将其编组回主机AppDomain,后者通过套接字将其发回.
该方法应该比较少的CPU更喜欢内存.
WCF不是一个选项.
我有以下代码:
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上真实对象的代理!)?
谢谢
我有一个Library1.dll包含一些接口的程序集,它们被序列化为数据库中的字节数组.出于某些原因,我们必须更改接口属性和定义.所以现在我正在编写一个迁移实用程序.所以我有2个版本Library1.dll,在我的实用程序中,我创建了一个文件夹,我存储了新版本Library1.dll.这个实用程序反过来也引用Library1.dllbin文件夹包含Library1.dll但是这个dll是在旧版本上编译的.我的新版本Library1.dll存储在一个私有路径中,我传递给Assembly.ReflectionOnlyLoadFrom函数实例化,因此GetTypes在加载的程序集上进一步使我能够进行数据转换.
但是ReflectionTypeLoadException当我试图Library1.dll从私人路径加载时我总是得到.
请帮帮忙!!! 任何帮助,将不胜感激.我真的被卡住了.
谢谢,AG
我正在评估驻留在同一台机器上的几个.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) 经过几天的谷歌搜索试图找到我的问题的确切答案后,这是最后的手段.
我创建了一个Windows服务,一个Windows窗体和一个Remoting对象(所有这些都在C#中).我正在使用Remoting对象使用事件在服务和表单之间进行通信.
以下是对象之间典型交互的简化示例:
这一切都很好,一切都在前5分钟左右完美地相互作用.在那之后,对象之间的连接以某种方式被切断,我不能再在对象之间进行通信.
解决问题的第一个尝试是覆盖InitializeLifetimeService方法以返回null.这没有帮助(虽然它可以避免任何未来的租赁问题).
第二次尝试是创建RemoteObject的AdminForm和AdminService ISponsors ,并将它们设置为续订对象的租约.再次,没有解决问题.
在我的各种谷歌搜索中,我发现有人提到有关事件处理程序被垃圾收集的事情.我不确定这是不是问题,但我想我会提到它.
这是连接空闲超过5分钟后弹出的错误:
用户代码未处理System.Runtime.Remoting.RemotingException
消息="未找到请求的服务"
Source ="System.Runtime.Remoting"
现在,关于这一点的奇怪之处在于它发生在AdminService端.该AdminForm呼吁方法RemoteObject的罚款.这会弹出事件,然后AdminService会看到此事件,并尝试调用RemoteObject的方法LoadFormData(字符串数据),这就是抛出异常的地方.
我完全厌倦了谷歌搜索,因为我似乎无法找到我需要修复它.
有没有办法确定哪个AppDomain是对象或ObjectHandle实例创建的?
我在尝试在远程服务器上运行我们的一些脚本时遇到了问题.
我们需要所有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进行远程会话?任何帮助将非常感激!
我正Streams从远程服务返回(.NET Remoting).但Streams也是一次性用品,我们都知道这些是待处理的.
我Dispose完成消费之后,我可以在客户端打电话.但是,当我Stream从远程对象返回时,我想知道封面下究竟发生了什么.
特别:
byte[]并返回而不是一个Stream?Stream与返回不同的是byte[]什么?最后,还是.NET Remoting必须以某种方式序列化数据?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并将其代理回服务器端的对象?
remoting ×10
c# ×7
.net ×6
.net-2.0 ×2
.net-3.5 ×1
appdomain ×1
clr ×1
dispose ×1
events ×1
ipc ×1
named-pipes ×1
networking ×1
powershell ×1
reflection ×1
rpc ×1
vb.net ×1
windows ×1