| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Channels
- {
- using System;
- using System.Net;
- using System.Runtime;
- using System.ServiceModel;
- using System.ServiceModel.Diagnostics;
- class ServiceContextProtocol : ContextProtocol
- {
- public ServiceContextProtocol(ContextExchangeMechanism contextExchangeMechanism)
- : base(contextExchangeMechanism)
- {
- // empty
- }
- public override void OnIncomingMessage(Message message)
- {
- if (message == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
- }
- if (this.ContextExchangeMechanism == ContextExchangeMechanism.HttpCookie)
- {
- this.OnReceiveHttpCookies(message);
- }
- else
- {
- this.OnReceiveSoapContextHeader(message);
- }
- // deserialize the callback context header, if present
- int headerIndex = message.Headers.FindHeader(CallbackContextMessageHeader.CallbackContextHeaderName, CallbackContextMessageHeader.CallbackContextHeaderNamespace);
- if (headerIndex > 0)
- {
- CallbackContextMessageProperty property = CallbackContextMessageHeader.ParseCallbackContextHeader(message.Headers.GetReaderAtHeader(headerIndex), message.Version.Addressing);
- message.Properties.Add(CallbackContextMessageProperty.Name, property);
- }
- ContextExchangeCorrelationHelper.AddIncomingContextCorrelationData(message);
- }
- public override void OnOutgoingMessage(Message message, RequestContext requestContext)
- {
- if (message == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
- }
- ContextMessageProperty messageContext;
- if (ContextMessageProperty.TryGet(message, out messageContext))
- {
- if (this.ContextExchangeMechanism == ContextExchangeMechanism.HttpCookie)
- {
- Fx.Assert(requestContext != null, "DuplexChannel shape cannot have ContextExchangeMechanism = HttpCookie");
- Uri requestUri = null;
- if (requestContext.RequestMessage.Properties != null)
- {
- requestUri = requestContext.RequestMessage.Properties.Via;
- }
- if (requestUri == null)
- {
- requestUri = requestContext.RequestMessage.Headers.To;
- }
- this.OnSendHttpCookies(message, messageContext, requestUri);
- }
- else
- {
- this.OnSendSoapContextHeader(message, messageContext);
- }
- }
- // verify that the callback context was not attached to an outgoing message
- CallbackContextMessageProperty dummy;
- if (CallbackContextMessageProperty.TryGet(message, out dummy))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new InvalidOperationException(SR.GetString(SR.CallbackContextNotExpectedOnOutgoingMessageAtServer, message.Headers.Action)));
- }
- }
- void OnReceiveHttpCookies(Message message)
- {
- object property;
- if (message.Properties.TryGetValue(HttpRequestMessageProperty.Name, out property))
- {
- HttpRequestMessageProperty httpRequest = property as HttpRequestMessageProperty;
- if (httpRequest != null)
- {
- string cookieHeader = httpRequest.Headers[HttpRequestHeader.Cookie];
- ContextMessageProperty messageContext;
- if (!string.IsNullOrEmpty(cookieHeader) && HttpCookieToolbox.TryCreateFromHttpCookieHeader(cookieHeader, out messageContext))
- {
- messageContext.AddOrReplaceInMessage(message);
- }
- }
- }
- }
- void OnReceiveSoapContextHeader(Message message)
- {
- ContextMessageProperty messageContext = ContextMessageHeader.GetContextFromHeaderIfExists(message);
- if (messageContext != null)
- {
- messageContext.AddOrReplaceInMessage(message);
- if (DiagnosticUtility.ShouldTraceVerbose)
- {
- TraceUtility.TraceEvent(System.Diagnostics.TraceEventType.Verbose,
- TraceCode.ContextProtocolContextRetrievedFromMessage,
- SR.GetString(SR.TraceCodeContextProtocolContextRetrievedFromMessage),
- this);
- }
- }
- }
- void OnSendHttpCookies(Message message, ContextMessageProperty context, Uri requestUri)
- {
- object tmpProperty;
- HttpResponseMessageProperty property = null;
- if (message.Properties.TryGetValue(HttpResponseMessageProperty.Name, out tmpProperty))
- {
- property = tmpProperty as HttpResponseMessageProperty;
- }
- if (property == null)
- {
- property = new HttpResponseMessageProperty();
- message.Properties.Add(HttpResponseMessageProperty.Name, property);
- }
- string setCookieHeader = HttpCookieToolbox.EncodeContextAsHttpSetCookieHeader(context, requestUri);
- property.Headers.Add(HttpResponseHeader.SetCookie, setCookieHeader);
- }
- }
- }
|