原始出处:http://wayfarer.blog.51cto.com/1300239/279909
C#语言:
public
interface IMessage:ICloneable
{
IMessageItemSequence GetMessageBody();
string GetMessageID();
string GetMessageName();
void SetMessageBody(IMessageItemSequence aMessageBody);
void SetMessageID( string aID);
void SetMessageName( string aName);
}
{
IMessageItemSequence GetMessageBody();
string GetMessageID();
string GetMessageName();
void SetMessageBody(IMessageItemSequence aMessageBody);
void SetMessageID( string aID);
void SetMessageName( string aName);
}
C#语言:
public
interface IMessageItemSequence:ICloneable
{
IMessageItem GetItem( string aName);
void SetItem( string aName,IMessageItem aMessageItem);
string GetValue( string aName);
void SetValue( string aName, string aValue);
}
{
IMessageItem GetItem( string aName);
void SetItem( string aName,IMessageItem aMessageItem);
string GetValue( string aName);
void SetValue( string aName, string aValue);
}
C#语言:
IMessageFactory factory =
new MessageFactory();
IMessageItemSequence body = factory.CreateMessageItemSequence();
body.SetValue( "name1", "value1");
body.SetValue( "name2", "value2");
IMessageItem item = factory.CreateMessageItem();
item.SetSubValue( "subname1", "subvalue1");
item.SetSubValue( "subname2", "subvalue2");
IMessageItem subItem1 = factory.CreateMessageItem();
subItem1.SetSubValue( "subsubname11", "subsubvalue11");
subItem1.SetSubValue( "subsubname12", "subsubvalue12");
IMessageItem subItem2 = factory.CreateMessageItem();
subItem1.SetSubValue( "subsubname21", "subsubvalue21");
subItem1.SetSubValue( "subsubname22", "subsubvalue22");
item.SetSubItem( "subitem1",subItem1);
item.SetSubItem( "subitem2",subItem2);
body.SetItem( "item",item);
//Send Request Message
MyServiceClient service = new MyServiceClient( "Client");
IMessageItemSequence reply = service.SendRequest( "TestService", "Test1",body);
IMessageItemSequence body = factory.CreateMessageItemSequence();
body.SetValue( "name1", "value1");
body.SetValue( "name2", "value2");
IMessageItem item = factory.CreateMessageItem();
item.SetSubValue( "subname1", "subvalue1");
item.SetSubValue( "subname2", "subvalue2");
IMessageItem subItem1 = factory.CreateMessageItem();
subItem1.SetSubValue( "subsubname11", "subsubvalue11");
subItem1.SetSubValue( "subsubname12", "subsubvalue12");
IMessageItem subItem2 = factory.CreateMessageItem();
subItem1.SetSubValue( "subsubname21", "subsubvalue21");
subItem1.SetSubValue( "subsubname22", "subsubvalue22");
item.SetSubItem( "subitem1",subItem1);
item.SetSubItem( "subitem2",subItem2);
body.SetItem( "item",item);
//Send Request Message
MyServiceClient service = new MyServiceClient( "Client");
IMessageItemSequence reply = service.SendRequest( "TestService", "Test1",body);
C#语言:
public
interface IService
{
IMessage Execute(IMessage aMessage);
}
{
IMessage Execute(IMessage aMessage);
}
C#语言:
public
interface IListenService
{
IMessage OnRequest(IMessage aMessage);
}
{
IMessage OnRequest(IMessage aMessage);
}
C#语言:
public
class
RequestListener:MarshalByRefObject,IService
{
public RequestListener(IListenService listenService)
{
m_ListenService = listenService;
}
private IListenService m_ListenService;
#region IService Members
public IMessage Execute(IMessage aMessage)
{
return this.m_ListenService.OnRequest(aMessage);
}
#endregion
public override object InitializeLifetimeService()
{
return null;
}
}
{
public RequestListener(IListenService listenService)
{
m_ListenService = listenService;
}
private IListenService m_ListenService;
#region IService Members
public IMessage Execute(IMessage aMessage)
{
return this.m_ListenService.OnRequest(aMessage);
}
#endregion
public override object InitializeLifetimeService()
{
return null;
}
}
C#语言:
public
abstract
class
Service:IListenService
{
public Service( string serviceName)
{
m_ServiceName = serviceName;
m_RequestListener = new RequestListener( this);
}
#region IListenService Members
public IMessage OnRequest(IMessage aMessage)
{
//……
}
#endregion
private string m_ServiceName;
private RequestListener m_RequestListener;
}
{
public Service( string serviceName)
{
m_ServiceName = serviceName;
m_RequestListener = new RequestListener( this);
}
#region IListenService Members
public IMessage OnRequest(IMessage aMessage)
{
//……
}
#endregion
private string m_ServiceName;
private RequestListener m_RequestListener;
}
C#语言:
public IMessageItemSequence SendRequest(
stringaServiceName,
string aMessageName,IMessageItemSequence aMessageBody)
{
IMessage message = m_Factory.CreateMessage();
message.SetMessageName(aMessageName);
message.SetMessageID( "");
message.SetMessageBody(aMessageBody);
IService service = FindService(aServiceName);
IMessageItemSequence replyBody = m_Factory.CreateMessageItemSequence();
if (service != null)
{
IMessage replyMessage = service.Execute(message);
replyBody = replyMessage.GetMessageBody();
}
else
{
replyBody.SetValue( "result", "Failure");
}
return replyBody;
}
{
IMessage message = m_Factory.CreateMessage();
message.SetMessageName(aMessageName);
message.SetMessageID( "");
message.SetMessageBody(aMessageBody);
IService service = FindService(aServiceName);
IMessageItemSequence replyBody = m_Factory.CreateMessageItemSequence();
if (service != null)
{
IMessage replyMessage = service.Execute(message);
replyBody = replyMessage.GetMessageBody();
}
else
{
replyBody.SetValue( "result", "Failure");
}
return replyBody;
}
C#语言:
public
void Initialize()
{
RemotingServices.Marshal( this.m_RequestListener, this.m_ServiceName + ".RequestListener");
}
{
RemotingServices.Marshal( this.m_RequestListener, this.m_ServiceName + ".RequestListener");
}
C#语言:
m_RequestListener =
new RequestListener(
this);
C#语言:
IService service = FindService(aServiceName);
C#语言:
protected IService FindService(
string aServiceName)
{
lock ( this.m_Services)
{
IService service = (IService)m_Services[aServiceName];
if (service != null)
{
return service;
}
else
{
IService tmpService = GetService(aServiceName);
AddService(aServiceName,tmpService);
return tmpService;
}
}
}
{
lock ( this.m_Services)
{
IService service = (IService)m_Services[aServiceName];
if (service != null)
{
return service;
}
else
{
IService tmpService = GetService(aServiceName);
AddService(aServiceName,tmpService);
return tmpService;
}
}
}
C#语言:
private IService GetService(
string aServiceName)
{
IService service = (IService)Activator.GetObject( typeof(RequestListener),
"tcp://localhost:9090/" + aServiceName + ".RequestListener");
return service;
}
{
IService service = (IService)Activator.GetObject( typeof(RequestListener),
"tcp://localhost:9090/" + aServiceName + ".RequestListener");
return service;
}
C#语言:
public
class
MyService:Service
{
public MyService( string aServiceName): base(aServiceName)
{}
}
{
public MyService( string aServiceName): base(aServiceName)
{}
}
C#语言:
public
delegate
void RequestHandler(
string aMessageName,IMessageItemSequence aMessageBody,
ref IMessageItemSequence aReplyMessageBody);
C#语言:
protected
abstract
void AddRequestHandlers();
protected void AddRequestHandler( string aMessageName,RequestHandler handler)
{
lock ( this.m_EventHandlers)
{
if (! this.m_EventHandlers.Contains(aMessageName))
{
this.m_EventHandlers.Add(aMessageName,handler);
}
}
}
protected RequestHandler FindRequestHandler( string aMessageName)
{
lock ( this.m_EventHandlers)
{
RequestHandler handler = (RequestHandler)m_EventHandlers[aMessageName];
return handler;
}
}
protected void AddRequestHandler( string aMessageName,RequestHandler handler)
{
lock ( this.m_EventHandlers)
{
if (! this.m_EventHandlers.Contains(aMessageName))
{
this.m_EventHandlers.Add(aMessageName,handler);
}
}
}
protected RequestHandler FindRequestHandler( string aMessageName)
{
lock ( this.m_EventHandlers)
{
RequestHandler handler = (RequestHandler)m_EventHandlers[aMessageName];
return handler;
}
}
C#语言:
public
class
MyService:Service
{
public MyService( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{
this.AddRequestHandler( "Test1", new RequestHandler(Test1));
this.AddRequestHandler( "Test2", new RequestHandler(Test2));
}
private void Test1( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
Console.WriteLine( "MessageName:{0}\n",aMessageName);
Console.WriteLine( "MessageBody:{0}\n",aMessageBody);
aReplyMessageBody.SetValue( "result", "Success");
}
private void Test2( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
Console.WriteLine( "Test2" + aMessageBody.ToString());
}
}
{
public MyService( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{
this.AddRequestHandler( "Test1", new RequestHandler(Test1));
this.AddRequestHandler( "Test2", new RequestHandler(Test2));
}
private void Test1( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
Console.WriteLine( "MessageName:{0}\n",aMessageName);
Console.WriteLine( "MessageBody:{0}\n",aMessageBody);
aReplyMessageBody.SetValue( "result", "Success");
}
private void Test2( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
Console.WriteLine( "Test2" + aMessageBody.ToString());
}
}
C#语言:
public IMessage OnRequest(IMessage aMessage)
{
string messageName = aMessage.GetMessageName();
string messageID = aMessage.GetMessageID();
IMessage message = m_Factory.CreateMessage();
IMessageItemSequence replyMessage = m_Factory.CreateMessageItemSequence();
RequestHandler handler = FindRequestHandler(messageName);
handler(messageName,aMessage.GetMessageBody(), ref replyMessage);
message.SetMessageName(messageName);
message.SetMessageID(messageID);
message.SetMessageBody(replyMessage);
return message;
}
{
string messageName = aMessage.GetMessageName();
string messageID = aMessage.GetMessageID();
IMessage message = m_Factory.CreateMessage();
IMessageItemSequence replyMessage = m_Factory.CreateMessageItemSequence();
RequestHandler handler = FindRequestHandler(messageName);
handler(messageName,aMessage.GetMessageBody(), ref replyMessage);
message.SetMessageName(messageName);
message.SetMessageID(messageID);
message.SetMessageBody(replyMessage);
return message;
}
C#语言:
public
class
TestService:Service
{
public TestService( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{
this.AddRequestHandler( "Test1", new RequestHandler(Test1));
}
private void Test1( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
aReplyMessageBody = SendRequest( "MyService",aMessageName,aMessageBody);
aReplyMessageBody.SetValue( "result2", "Success");
}
}
{
public TestService( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{
this.AddRequestHandler( "Test1", new RequestHandler(Test1));
}
private void Test1( string aMessageName,IMessageItemSequence aMessageBody, ref IMessageItemSequence aReplyMessageBody)
{
aReplyMessageBody = SendRequest( "MyService",aMessageName,aMessageBody);
aReplyMessageBody.SetValue( "result2", "Success");
}
}
C#语言:
public
class
MyServiceClient:Service
{
public MyServiceClient( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{}
}
{
public MyServiceClient( string aServiceName): base(aServiceName)
{}
protected override void AddRequestHandlers()
{}
}
C#语言:
IMessageFactory factory =
new MessageFactory();
IMessageItemSequence body = factory.CreateMessageItemSequence();
//……
MyServiceClient service = new MyServiceClient( "Client");
IMessageItemSequence reply = service.SendRequest( "TestService", "Test1",body);
IMessageItemSequence body = factory.CreateMessageItemSequence();
//……
MyServiceClient service = new MyServiceClient( "Client");
IMessageItemSequence reply = service.SendRequest( "TestService", "Test1",body);
C#语言:
public
class
Server
{
public Server()
{
m_Services = new ArrayList();
}
private ArrayList m_Services;
public void AddService(IListenService service)
{
this.m_Services.Add(service);
}
public void Initialize()
{
IDictionary tcpProp = new Hashtable();
tcpProp[ "name"] = "tcp9090";
tcpProp[ "port"] = 9090;
TcpChannel channel = new TcpChannel(tcpProp, newBinaryClientFormatterSinkProvider(),
newBinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
foreach (Service service in m_Services)
{
service.Initialize();
}
}
}
{
public Server()
{
m_Services = new ArrayList();
}
private ArrayList m_Services;
public void AddService(IListenService service)
{
this.m_Services.Add(service);
}
public void Initialize()
{
IDictionary tcpProp = new Hashtable();
tcpProp[ "name"] = "tcp9090";
tcpProp[ "port"] = 9090;
TcpChannel channel = new TcpChannel(tcpProp, newBinaryClientFormatterSinkProvider(),
newBinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
foreach (Service service in m_Services)
{
service.Initialize();
}
}
}
C#语言:
static
void Main(
string[] args)
{
MyService service = new MyService( "MyService");
TestService service1 = new TestService( "TestService");
Server server = new Server();
server.AddService(service);
server.AddService(service1);
server.Initialize();
Console.ReadLine();
}
{
MyService service = new MyService( "MyService");
TestService service1 = new TestService( "TestService");
Server server = new Server();
server.AddService(service);
server.AddService(service1);
server.Initialize();
Console.ReadLine();
}