Chyba dodanie messageInspectora bedzie najelegantsze
CHyba mi się nudziło że to zrobiłem, nawet działa chyba.
A tak na marginesie po co jest ten content, w message headers na serwisie tego nie widzę.
?
klasa implementująca messageInspectora
class MessageHeaderAdd_Inspector : IClientMessageInspector
{
protected MessageHeader messaeg_header = null;
public MessageHeaderAdd_Inspector(MessageHeader messaeg_header)
{
this.messaeg_header = messaeg_header;
}
#region IClientMessageInspector Members
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
request.Headers.Add(messaeg_header);
return null;
}
#endregion
}
klasa implementujaca endpoint behavior, przekazujemy jej message header ktory bedzie dodawany
class MessageHeaderAdd_Behavior : IEndpointBehavior
{
protected MessageHeader message_header = null;
public MessageHeaderAdd_Behavior(MessageHeader message_header)
{
this.message_header = message_header;
}
#region IEndpointBehavior Members
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(
new MessageHeaderAdd_Inspector(this.message_header)
);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
#endregion
}
dalej, klasa abstraykcyjna obudowujaca channel, tylko przykladowo, mozna by dziedziczyc po IChannel aby to było porządniej
abstract class AClientSideChannel<T>
{
protected ChannelFactory<T> ChannelFactory = null;
protected T ClientCallChannel;
public abstract void SetFactoryInstance(ChannelFactory<T> channel_factory_instance);
public abstract void CreateChannel();
public abstract void AddBehavior(IEndpointBehavior behavior);
}
i przykladowa klasa implementująca Aclientsidechannel z <ITestService>
class TSClientSideChannel : AClientSideChannel<ITestService>,ITestService
{
public TSClientSideChannel()
{
}
public override void SetFactoryInstance(ChannelFactory<ITestService> channel_factory_instance)
{
this.ChannelFactory = channel_factory_instance;
}
public override void CreateChannel()
{
this.ClientCallChannel = this.ChannelFactory.CreateChannel();
}
public override void AddBehavior(IEndpointBehavior behavior)
{
this.ChannelFactory.Endpoint.Behaviors.Add(behavior);
}
#region ITestService Members
public string SendMessage(string message)
{
return this.ClientCallChannel.SendMessage(message);
}
public int GetMagicNumber()
{
return this.ClientCallChannel.GetMagicNumber();
}
#endregion
}
Uruchomienie tego jest stosunkowo proste
Tworzymy instancje channel factory dając typ ITestService
ChannelFactory<ITestService> channel_factory = new ChannelFactory<ITestService>(new NetTcpBinding(),
new EndpointAddress("net.tcp://79.185.71.117:6789/TestService")
);
dodajemy behavior ktoremu przekazujemy messageheader jako parameter
channel_factory.Endpoint.Behaviors.Add(new MessageHeaderAdd_Behavior(
new MessageHeader<string>("CONT").GetUntypedHeader("name param", "ns param")
)
);
AClientSideChannel<ITestService> ClientSide = new TSClientSideChannel();
ClientSide.SetFactoryInstance(channel_factory);
ClientSide.CreateChannel();
string return_value = ((TSClientSideChannel)ClientSide).SendMessage("Hello");
Console.WriteLine(return_value);
Mam nadzieje że o to chodziło ;P