Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace NPB
- {
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Description;
- using System.ServiceModel.Dispatcher;
- using System.Xml;
- using Newtonsoft.Json.Linq;
- [ServiceContract]
- public interface ITransformer
- {
- [OperationContract]
- [NetDataContractFormatAttribute]
- JObject Transform(JObject o);
- }
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
- public class Transformer : ITransformer
- {
- public JObject Transform(JObject o)
- {
- o["Modified"] = new JValue(true);
- return o;
- }
- }
- public class NetDataContractFormatAttribute : Attribute, IOperationBehavior
- {
- public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
- {
- }
- public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
- {
- ReplaceDataContractSerializerOperationBehavior(description);
- }
- public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
- {
- ReplaceDataContractSerializerOperationBehavior(description);
- }
- public void Validate(OperationDescription description)
- {
- }
- private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
- {
- var dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
- if (dcs != null)
- description.Behaviors.Remove(dcs);
- description.Behaviors.Add(new NetDataContractSerializerOperationBehavior(description));
- }
- public class NetDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
- {
- private static readonly NetDataContractSerializer Serializer = new NetDataContractSerializer();
- public NetDataContractSerializerOperationBehavior(OperationDescription operationDescription)
- : base(operationDescription)
- {
- }
- public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns,
- IList<Type> knownTypes)
- {
- return Serializer;
- }
- public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name,
- XmlDictionaryString ns, IList<Type> knownTypes)
- {
- return Serializer;
- }
- }
- }
- public class RemoteTransformer : MarshalByRefObject
- {
- private readonly Transformer _transfomer = new Transformer();
- public JObject Transform(JObject o)
- {
- return _transfomer.Transform(o);
- }
- }
- internal class Program
- {
- private static void Main(string[] args)
- {
- var t = new RemoteTransformer();
- var stopwatch1 = Stopwatch.StartNew();
- for (int i = 0; i < 100000; i++)
- {
- var jobj = new JObject(new JProperty("Hello", "There"));
- t.Transform(jobj);
- }
- Console.WriteLine(stopwatch1.ElapsedMilliseconds);
- var basePipeAddress = new Uri("net.pipe://localhost/TestService");
- var host = new ServiceHost(typeof (Transformer), basePipeAddress);
- var pipeBinding = new NetNamedPipeBinding();
- host.AddServiceEndpoint(typeof (ITransformer), pipeBinding, basePipeAddress);
- host.Open();
- Console.WriteLine("Service is ready");
- Console.WriteLine("Creating client");
- var fact = new ChannelFactory<ITransformer>(new NetNamedPipeBinding(), basePipeAddress.ToString());
- var serviceInstance = fact.CreateChannel();
- using (serviceInstance as IDisposable)
- {
- Console.WriteLine("Running transform loop");
- var startNew = Stopwatch.StartNew();
- for (int i = 0; i < 100000; i++)
- {
- var jobj = new JObject(new JProperty("Hello", "There"));
- serviceInstance.Transform(jobj);
- }
- Console.WriteLine(startNew.ElapsedMilliseconds);
- }
- Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement