-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.ServiceModel;\r
-using System.ServiceModel.Channels;\r
-\r
-namespace System.ServiceModel.Dispatcher \r
-{\r
- internal class MessageProcessingContext \r
- {\r
- OperationContext operation_context;\r
- RequestContext request_context;\r
- Message incoming_message;\r
- IDefaultCommunicationTimeouts timeouts;\r
-\r
- Message reply_message; \r
- InstanceContext instance_context; \r
- Exception processingException;\r
- DispatchOperation operation;\r
- UserEventsHandler user_events_handler; \r
-\r
- public MessageProcessingContext (OperationContext opCtx)\r
- {\r
- operation_context = opCtx;\r
- request_context = opCtx.RequestContext;\r
- incoming_message = opCtx.IncomingMessage;\r
- timeouts = opCtx.CommunicationTimeouts;\r
- user_events_handler = new UserEventsHandler (this);\r
- }\r
-\r
- public DispatchOperation Operation\r
- {\r
- get { return operation; }\r
- set { operation = value; }\r
- }\r
-\r
- public Exception ProcessingException\r
- {\r
- get { return processingException; }\r
- set { processingException = value; }\r
- }\r
- \r
- public Message ReplyMessage\r
- {\r
- get { return reply_message; }\r
- set { reply_message = value; }\r
- }\r
-\r
- public IDefaultCommunicationTimeouts CommunicationTimeouts\r
- {\r
- get { return timeouts; }\r
- set { timeouts = value; }\r
- } \r
-\r
- public InstanceContext InstanceContext\r
- {\r
- get { return instance_context; }\r
- set { instance_context = value; }\r
- }\r
-\r
- public Message IncomingMessage\r
- {\r
- get { return incoming_message; }\r
- set { incoming_message = value; }\r
- }\r
-\r
- public RequestContext RequestContext\r
- {\r
- get { return request_context; }\r
- set { request_context = value; }\r
- }\r
-\r
- public OperationContext OperationContext\r
- {\r
- get { return operation_context; }\r
- set { operation_context = value; }\r
- }\r
-\r
- public UserEventsHandler EventsHandler\r
- {\r
- get { return user_events_handler; }\r
- set { user_events_handler = value; }\r
- }\r
-\r
- public void Reply (bool useTimeout)\r
- {\r
- EventsHandler.BeforeSendReply ();\r
- if (useTimeout)\r
- RequestContext.Reply (ReplyMessage, CommunicationTimeouts.SendTimeout);\r
- else\r
- RequestContext.Reply (ReplyMessage);\r
- } \r
- }\r
-\r
- #region user events implementation\r
-\r
- internal class UserEventsHandler\r
- {\r
- MessageProcessingContext request_context;\r
- DispatchRuntime dispatch_runtime;\r
- IClientChannel channel;\r
- object [] msg_inspectors_states;\r
- object [] callcontext_initializers_states;\r
-\r
- public UserEventsHandler (MessageProcessingContext mrc)\r
- {\r
- request_context = mrc;\r
- dispatch_runtime = mrc.OperationContext.EndpointDispatcher.DispatchRuntime;\r
- msg_inspectors_states = new object [dispatch_runtime.MessageInspectors.Count];\r
- channel = request_context.OperationContext.Channel as IClientChannel;\r
- }\r
-\r
- public void AfterReceiveRequest ()\r
- {\r
- Message message = request_context.IncomingMessage;\r
-\r
- for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)\r
- msg_inspectors_states [i] = dispatch_runtime.MessageInspectors [i].AfterReceiveRequest (\r
- ref message, channel, request_context.InstanceContext);\r
- request_context.IncomingMessage = message;\r
-\r
- }\r
-\r
- public void BeforeSendReply ()\r
- {\r
- Message toBeChanged = request_context.ReplyMessage;\r
- for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)\r
- dispatch_runtime.MessageInspectors [i].BeforeSendReply (ref toBeChanged, msg_inspectors_states [i]);\r
- }\r
-\r
- public void BeforeInvoke (DispatchOperation operation)\r
- {\r
- callcontext_initializers_states = new object [operation.CallContextInitializers.Count];\r
- for (int i = 0; i < callcontext_initializers_states.Length; ++i)\r
- callcontext_initializers_states [i] = operation.CallContextInitializers [i].BeforeInvoke (\r
- request_context.InstanceContext, channel, request_context.IncomingMessage);\r
-\r
- }\r
-\r
- public void AfterInvoke (DispatchOperation operation)\r
- {\r
- for (int i = 0; i < callcontext_initializers_states.Length; ++i)\r
- operation.CallContextInitializers [i].AfterInvoke (callcontext_initializers_states [i]);\r
- }\r
- }\r
-\r
- #endregion\r
-}\r
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+namespace System.ServiceModel.Dispatcher
+{
+ internal class MessageProcessingContext
+ {
+ OperationContext operation_context;
+ RequestContext request_context;
+ Message incoming_message;
+
+ Message reply_message;
+ InstanceContext instance_context;
+ Exception processingException;
+ DispatchOperation operation;
+ UserEventsHandler user_events_handler;
+ IChannel reply_or_input;
+
+ public MessageProcessingContext (OperationContext opCtx, IChannel replyOrInput)
+ {
+ operation_context = opCtx;
+ request_context = opCtx.RequestContext;
+ incoming_message = opCtx.IncomingMessage;
+ user_events_handler = new UserEventsHandler (this);
+ reply_or_input = replyOrInput;
+ }
+
+ public IChannel Channel {
+ get { return reply_or_input; }
+ }
+
+ public DispatchOperation Operation
+ {
+ get { return operation; }
+ set { operation = value; }
+ }
+
+ public Exception ProcessingException
+ {
+ get { return processingException; }
+ set { processingException = value; }
+ }
+
+ public Message ReplyMessage
+ {
+ get { return reply_message; }
+ set { reply_message = value; }
+ }
+
+ public InstanceContext InstanceContext
+ {
+ get { return instance_context; }
+ set { instance_context = value; }
+ }
+
+ public Message IncomingMessage
+ {
+ get { return incoming_message; }
+ set { incoming_message = value; }
+ }
+
+ public RequestContext RequestContext
+ {
+ get { return request_context; }
+ set { request_context = value; }
+ }
+
+ public OperationContext OperationContext
+ {
+ get { return operation_context; }
+ set { operation_context = value; }
+ }
+
+ public UserEventsHandler EventsHandler
+ {
+ get { return user_events_handler; }
+ set { user_events_handler = value; }
+ }
+
+ public void Reply (IDuplexChannel channel, bool useTimeout)
+ {
+ EventsHandler.BeforeSendReply ();
+ if (useTimeout && Operation.Parent.ChannelDispatcher != null) // FIXME: this condition is a workaround for NRE, there might be better way to get timeout value.
+ channel.Send (ReplyMessage, Operation.Parent.ChannelDispatcher.timeouts.SendTimeout);
+ else
+ channel.Send (ReplyMessage);
+ }
+
+ public void Reply (bool useTimeout)
+ {
+ EventsHandler.BeforeSendReply ();
+ if (useTimeout && Operation.Parent.ChannelDispatcher != null) // FIXME: this condition is a workaround for NRE, there might be better way to get timeout value.
+ RequestContext.Reply (ReplyMessage, Operation.Parent.ChannelDispatcher.timeouts.SendTimeout);
+ else
+ RequestContext.Reply (ReplyMessage);
+ }
+ }
+
+ #region user events implementation
+
+ internal class UserEventsHandler
+ {
+ MessageProcessingContext request_context;
+ DispatchRuntime dispatch_runtime;
+ IClientChannel channel;
+ object [] msg_inspectors_states;
+ object [] callcontext_initializers_states;
+
+ public UserEventsHandler (MessageProcessingContext mrc)
+ {
+ request_context = mrc;
+ dispatch_runtime = mrc.OperationContext.EndpointDispatcher.DispatchRuntime;
+ msg_inspectors_states = new object [dispatch_runtime.MessageInspectors.Count];
+ channel = request_context.OperationContext.Channel as IClientChannel;
+ }
+
+ public void AfterReceiveRequest ()
+ {
+ Message message = request_context.IncomingMessage;
+
+ for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)
+ msg_inspectors_states [i] = dispatch_runtime.MessageInspectors [i].AfterReceiveRequest (
+ ref message, channel, request_context.InstanceContext);
+ request_context.IncomingMessage = message;
+
+ }
+
+ public void BeforeSendReply ()
+ {
+ Message toBeChanged = request_context.ReplyMessage;
+ for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)
+ dispatch_runtime.MessageInspectors [i].BeforeSendReply (ref toBeChanged, msg_inspectors_states [i]);
+ request_context.ReplyMessage = toBeChanged;
+ }
+
+ public void BeforeInvoke (DispatchOperation operation)
+ {
+ callcontext_initializers_states = new object [operation.CallContextInitializers.Count];
+ for (int i = 0; i < callcontext_initializers_states.Length; ++i)
+ callcontext_initializers_states [i] = operation.CallContextInitializers [i].BeforeInvoke (
+ request_context.InstanceContext, channel, request_context.IncomingMessage);
+
+ }
+
+ public void AfterInvoke (DispatchOperation operation)
+ {
+ for (int i = 0; i < callcontext_initializers_states.Length; ++i)
+ operation.CallContextInitializers [i].AfterInvoke (callcontext_initializers_states [i]);
+ }
+ }
+
+ #endregion
+}