我有以下 WCF 服务器和客户端代码,我对它们的 [原始形式] ( http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication ) 做了一些更改。
服务器:
using System;
using System.ServiceModel;
namespace WCFServer
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
bool ReverseString(string value, out string reversed);
}
public class StringReverser : IStringReverser
{
public bool ReverseString(string value, out string reversed)
{
char[] retVal = value.ToCharArray();
int idx = 0;
for (int i = value.Length - 1; i >= 0; i--)
retVal[idx++] = value[i];
reversed = new string(retVal);
return true;
}
}
class Program
{
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(StringReverser), new[]{new Uri("net.pipe://localhost")}))
{
host.AddServiceEndpoint(typeof(IStringReverser),
new NetNamedPipeBinding(),
"PipeReverse" + args[0]);
host.Open();
while (true)
{
}
}
}
}
}
客户:
using System;
using System.Diagnostics;
using System.Globalization;
using System.ServiceModel;
namespace WCFClient
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
bool ReverseString(string value, out string reversed);
}
class Program
{
static void Main()
{
var currentThreadIdStr = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture);
// Start off the service
Process server = new Process();
server.StartInfo.FileName = "WCFServer.exe";
server.StartInfo.Arguments = currentThreadIdStr;
server.StartInfo.UseShellExecute = false;
server.Start();
// Try to connect to the server
ChannelFactory<IStringReverser> pipeFactory =
new ChannelFactory<IStringReverser>(
new NetNamedPipeBinding(),
new EndpointAddress(
"net.pipe://localhost/PipeReverse" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)));
IStringReverser pipeProxy =
pipeFactory.CreateChannel();
Console.WriteLine("type \"quit\" to exit\n");
string str;
string reversedString;
while ( (str = Console.ReadLine()) != "quit")
{
bool wasReversedSuccesfully = pipeProxy.ReverseString(str, out reversedString);
Console.WriteLine("pipe: Succesful: " + wasReversedSuccesfully + " reverse of " + str + " is:" + reversedString);
}
//// Kill the service
server.Kill();
}
}
}
我的问题是:
有没有更好的方法从客户端代码结束服务器?我在上面杀死它的方式有什么缺陷或问题吗?
谢谢!