根据这篇文章,带有命名管道的WCF是IPC的最佳选择,它比.Net Remoting快25%左右.
我有以下代码将WCF与命名管道与.Net Remoting进行比较:
[ServiceContract]
internal interface IRemote
{
[OperationContract]
string Hello(string name);
}
[ServiceBehavior]
internal class Remote : MarshalByRefObject, IRemote
{
public string Hello(string name)
{
return string.Format("Hello, {0}!", name);
}
}
class Program
{
private const int Iterations = 5000;
static void Main(string[] args)
{
TestWcf(Iterations);
TestRemoting(Iterations);
TestWcf(Iterations);
TestRemoting(Iterations);
TestWcf(Iterations);
TestRemoting(Iterations);
Console.ReadKey();
}
private static void TestRemoting(int iterations)
{
var domain = AppDomain.CreateDomain("TestDomain");
var proxy =
(IRemote)
domain.CreateInstanceFromAndUnwrap(Assembly.GetEntryAssembly().Location, "ConsoleApplication6.Remote");
Console.WriteLine("Remoting: {0} ms.", Test(proxy, iterations));
}
private …
Run Code Online (Sandbox Code Playgroud) 我希望这很简单.我在一个大的代码库上工作,总体质量很好,但偶尔你会得到一些:
try
{
// Calls a .NET remoting method.
}
catch
{
throw;
}
Run Code Online (Sandbox Code Playgroud)
注意,没有最终的逻辑,catch没有指定任何异常或做除了我上面提供的任何其他操作.但是,我知道捕获和重新抛出可以改变异常细节中的调用堆栈.我不确定的是,这种行为是否特别是因为.NET远程调用.
删除这个try-catch是否安全?据我所知,它是,但我想我会先检查一下所有奇怪的行为.
我想知道我可以从.net远程处理和WCF做同样的事情,那么为什么WCF比.Net远程处理更受欢迎.我在哪里可以选择(或在哪种情况下).Net远程处理或WCF?
我有一个使用远程工作的Windows服务应用程序.它用于显示气球尖端.但是,它有时会抛出此错误:
Exception :Requested Service not found
Inner Exception : Stack Trace : Server stack trace: at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at Baloontip.clsBaloonTool.Messagebox(String Message)
任何人都可以帮我解决这个问题.
我有一个Python脚本,可以处理来自.NET Remoting的异步回调.这些回调在虚拟(工作)线程中执行.从我的回调处理程序里面,我需要调用我在脚本中定义的函数,但是我需要在主线程中执行该函数.
主线程是一个向服务器发送命令的远程客户端.其中一些命令导致异步回调.
基本上,我需要相当于.NET的Invoke方法.这可能吗?
我知道Web服务并且对远程处理有一些了解.这两个概念都在客户机上调用方法,所以区别在哪里?
通过远程处理我们也可以在远程机器上执行该方法,同样的功能也可以通过Web服务实现.
如果这是一个明显的问题,请原谅我..
我可以理解WCF通常比Remoting更好,但两者看起来与我完全不同.MS制作这张漂亮的照片,以显示WCF有多棒(或者其他技术人员每次仅检查一个盒子的差距): alt text http://i.msdn.microsoft.com/dynimg/IC371617.jpg
但是,WCF以SOA为中心,我认为假设每个联网应用程序都希望公开服务是不正确的.
在我的情况下,我正在寻找在不同PC上的两个服务器应用程序实例之间复制对象的方法.WCF似乎只是提供了一个现代版本的COM ...获取一个对象并调用方法,它神奇地调用另一台PC上的版本.但Remoting似乎做了一些完全不同的事情,我不清楚为什么它被弃用而不被类似的技术取代.
那么,MS甚至声称Remoting已经死了吗?或者他们仍然支持它,承认它与 WCF 并列吗?
我有一个.NET Remoting服务,大部分时间都可以正常工作.如果发生异常或错误,它会将错误记录到文件中,但仍会继续运行.
但是,大约每两周一次服务停止响应客户端,这会导致客户端应用程序因SocketException崩溃并显示以下消息:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Run Code Online (Sandbox Code Playgroud)
没有异常或堆栈跟踪写入我们的日志文件,所以我无法弄清楚服务崩溃的位置,这使我相信它在我的代码之外的某个地方失败了.我可以采取哪些额外步骤来找出这次崩溃的根本原因?我会想象它会在某个地方向EventLog写一些东西,但我对Windows的事件记录系统并不是很熟悉,所以我不确定在哪里看.
在此先感谢任何帮助.
编辑:忘记提及,停止或重新启动服务什么都不做,服务永远不会响应.在我再次启动服务之前,我需要手动终止进程.
编辑2:
public class ClientInfoServerSinkProvider :
IServerChannelSinkProvider
{
private IServerChannelSinkProvider _nextProvider = null;
public ClientInfoServerSinkProvider()
{
}
public ClientInfoServerSinkProvider(
IDictionary properties,
ICollection providerData)
{
}
public IServerChannelSinkProvider Next
{
get { return _nextProvider; }
set { _nextProvider = value; }
}
public IServerChannelSink CreateSink(IChannelReceiver channel)
{ …
Run Code Online (Sandbox Code Playgroud) 有没有办法确定哪个AppDomain是对象或ObjectHandle实例创建的?
我正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并将其代理回服务器端的对象?
.net-remoting ×10
c# ×9
.net ×7
wcf ×4
remoting ×3
dispose ×1
event-log ×1
named-pipes ×1
python ×1
web-services ×1