在下面的服務器實現演示如何保持呼叫之間的狀態。
// this gets instantiated by clients over remoting
public class Server:MarshalByRefObject
{
// server wide state
public static int Value;
// state only for this instance (that can be shared with several clients
// depending on its activation model)
private StringBuilder buildup;
// an instance
public Server()
{
buildup = new StringBuilder();
Console.WriteLine("server started");
}
// do something useful
public int DoWork(char ch)
{
Console.WriteLine("server received {0}", ch);
buildup.Append(ch);
return Value;
}
// return all typed chars
public string GetMessage()
{
Console.WriteLine("server GetMessage called") ;
return buildup.ToString();
}
// how long should this instance live
public override object InitializeLifetimeService()
{
// run forever
return null;
}
}
注意覆蓋InitializeLifetimeService
。如果你不控制這個,你的實例將在5分鐘後被刪除。
要使用上述類,我們使用以下代碼來啓動並運行偵聽器,其中包括一些邏輯。不要忘記添加對組件System.Runtime.Remoting
的引用。
static void Main(string[] args)
{
// which port
var chn = new HttpChannel(1234);
ChannelServices.RegisterChannel(chn, false);
// Create only ONE Server instance
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Server), "server", WellKnownObjectMode.Singleton);
Server.Value = 0;
while (!Console.KeyAvailable)
{
Server.Value++;
System.Threading.Thread.Sleep(1000);
Console.WriteLine(Server.Value);
}
}
當這段代碼運行時,它應該監聽端口1234上的本地盒子進行連接。首次運行時,我必須禁用防火牆,允許該端口通過本地防火牆。
使用Server
的客戶端實現可能如下所示。不要忘記添加對組件System.Runtime.Remoting
的引用。
static void Main(string[] args)
{
var chn = new HttpChannel();
ChannelServices.RegisterChannel(chn, false);
RemotingConfiguration.RegisterWellKnownClientType(
typeof(Server),
"http://localhost:1234/server");
Console.WriteLine("Creating server...");
var s = new Server();
Console.WriteLine("type chars, press p to print, press x to stop");
var ch = Console.ReadKey();
while(ch.KeyChar != 'x')
{
switch(ch.KeyChar)
{
case 'p':
Console.WriteLine("msg: {0}", s.GetMessage());
break;
default:
Console.WriteLine("Got value {0} ", s.DoWork(ch.KeyChar));
break;
}
ch = Console.ReadKey();
}
Console.WriteLine("stopped");
}
如果你編譯並運行此您的結果可能是這樣的:
.NET遠程應僅用於與舊式組件協同工作,任何新的發展應該在WCF來完成。 (請參閱[本頁]頂部的粗體文本(https://msdn.microsoft.com/en-us/library/kwdt6w2k(v = vs.100).ASPX)) –
@ScottChamberlain即使WCF幾乎是不推薦使用,不應用於新的開發,除非您真的需要SOAP或僅由WCF啓用的某些特性。否則,請使用WebAPI。在這種情況下,計算器可以使用服務器並請求x增加。 x可以是靜態的,並且操作可以簡單地返回全局值(儘管我不會將此置於生產中以顯示併發問題)。 – gretro
@gretro meh,我說WCF和WebAPI共存。一個對一些東西有好處,一個對其他東西有好處。兩者都不能取代另一個。 –