下面是我在网上找的代码但是我刚学remoting不知道怎么用?请高手指教
using System;
using System.Collections;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Net;namespace RemotingServer
{ public class ClientIPServerSinkProvider : IServerChannelSinkProvider
{
private IServerChannelSinkProvider next = null;
public ClientIPServerSinkProvider(IDictionary properties, ICollection providerData)
{ } public void GetChannelData(IChannelDataStore channelData)
{ } public IServerChannelSink CreateSink(IChannelReceiver channel)
{
IServerChannelSink nextSink = null;
if (next != null)
{
nextSink = next.CreateSink(channel);
}
return new ClientIPServerSink(nextSink);
} public IServerChannelSinkProvider Next
{
get { return next; }
set { next = value; }
}
} public class ClientIPServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
{ private IServerChannelSink _next; public ClientIPServerSink(IServerChannelSink next)
{
_next = next;
} public void AsyncProcessResponse(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
{ } public Stream GetResponseStream(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
{
return null;
} public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
if (_next != null)
{
IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress; Console.WriteLine(ip.ToString()); CallContext.SetData("ClientIPAddress", ip); ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); return spres; } else
{ responseMsg = null; responseHeaders = null; responseStream = null; return new ServerProcessing(); } } public IServerChannelSink NextChannelSink
{ get { return _next; } set { _next = value; } } }}
using System;
using System.Collections;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Net;namespace RemotingServer
{ public class ClientIPServerSinkProvider : IServerChannelSinkProvider
{
private IServerChannelSinkProvider next = null;
public ClientIPServerSinkProvider(IDictionary properties, ICollection providerData)
{ } public void GetChannelData(IChannelDataStore channelData)
{ } public IServerChannelSink CreateSink(IChannelReceiver channel)
{
IServerChannelSink nextSink = null;
if (next != null)
{
nextSink = next.CreateSink(channel);
}
return new ClientIPServerSink(nextSink);
} public IServerChannelSinkProvider Next
{
get { return next; }
set { next = value; }
}
} public class ClientIPServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
{ private IServerChannelSink _next; public ClientIPServerSink(IServerChannelSink next)
{
_next = next;
} public void AsyncProcessResponse(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
{ } public Stream GetResponseStream(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
{
return null;
} public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
if (_next != null)
{
IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress; Console.WriteLine(ip.ToString()); CallContext.SetData("ClientIPAddress", ip); ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); return spres; } else
{ responseMsg = null; responseHeaders = null; responseStream = null; return new ServerProcessing(); } } public IServerChannelSink NextChannelSink
{ get { return _next; } set { _next = value; } } }}
可以很简单得使用RemotingConfiguration.Configure()方法来载入config文件使用插入sink,这个网上的教程很多,具体可以参照Rickie Lee的文章《如何定制Sink扩展.Net Remoting功能》http://www.cnblogs.com/rickie/archive/2004/10/21/54891.html
另外还可以自己定制tcpchannel中sinkprovider chain的生成来使用自定义的sink。
代码如下:Client:BinaryServerFormatterSinkProvider serverProvider =
new BinaryServerFormatterSinkProvider();BinaryClientFormatterSinkProvider clientProvider =
new BinaryClientFormatterSinkProvider();serverProvider.TypeFilterLevel = TypeFilterLevel.Full;IDictionary props = new Hashtable();
props["port"] = 0;System.Runtime.Remoting.Channels.Tcp.TcpChannel tcc =
new TcpChannel(props,clientProvider,serverProvider);
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(tcc);
Hello h = (Hello)System.Activator.GetObject(typeof(Hello),"tcp://localhost:4400/TestRemoting");
System.Console.WriteLine(h.SayHello());
Server:
BinaryServerFormatterSinkProvider serverProvider =
new BinaryServerFormatterSinkProvider();remotingTest.CClientIPInjectorSinkProvider IPProvider =
new CClientIPInjectorSinkProvider();
IPProvider.Next = serverProvider;//链接上下一个provider
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;IDictionary props = new Hashtable();
props["port"] = 4400;
props["id"]=string.Empty;
Hello h = new Hello();System.Runtime.Remoting.Channels.Tcp.TcpServerChannel tsc =
new TcpServerChannel(props,IPProvider);
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(tsc);
ObjRef objrefWellKnown =
System.Runtime.Remoting.RemotingServices.Marshal(h,"TestRemoting");
System.Console.WriteLine("回车结束服务器运行!");
System.Console.ReadLine();=======================================
to lxhvc
并不一定需要成对出现,在ingo rammar的例子里面他使用了
IPAddress IPAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
的方法,所以,只要在服务端把这个sink插入进去就可以了。
而CommonTransportKeys中正好含有客户端的IP地址。sink 无需成对,事实上在Client和Server端的sink chain中都不一定是成对反向排列的。
这些都可以在ingo rammar的书里面找到例子。