Reputation: 351
I have the following WCF server and client code which I changed a bit from their [original form] (http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication).
Server:
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)
{
}
}
}
}
}
Client:
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();
}
}
}
My question is:
Is there any better way of ending the server from the client code? Is there any flaw or problem with the way I am killing it in above?
Thanks!
Upvotes: 0
Views: 547
Reputation: 14929
Based on the comments you have provided, instead of killing service instance directly; you may just mark your service InstanceContextMode=PerCall
and ConcurrencyMode=Multiple
. This way, for every request a new instance will be created and this instance will run on a thread assigned by WCF host.
Beware that, during execution, the thread on which operation is being executed may change.
Upvotes: 2