File: System\ServiceModel\BasicHttpContextBinding.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.ServiceModel
{
    using System;
    using System.ComponentModel;
    using System.Configuration;
    using System.Net.Security;
    using System.Runtime.CompilerServices;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Configuration;
 
    [TypeForwardedFrom("System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
    public class BasicHttpContextBinding : BasicHttpBinding
    {
        bool contextManagementEnabled = ContextBindingElement.DefaultContextManagementEnabled;
 
        public BasicHttpContextBinding()
            : base()
        {
            this.AllowCookies = true;
        }
 
        public BasicHttpContextBinding(BasicHttpSecurityMode securityMode)
            : base(securityMode)
        {
            this.AllowCookies = true;
        }
 
        public BasicHttpContextBinding(string configName)
            : base()
        {
            if (configName == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("configName");
            }
 
            BasicHttpContextBindingCollectionElement section = BasicHttpContextBindingCollectionElement.GetBindingCollectionElement();
            BasicHttpContextBindingElement element = section.Bindings[configName];
            element.ApplyConfiguration(this);
            if (element.ElementInformation.Properties["allowCookies"].ValueOrigin == PropertyValueOrigin.Default)
            {
                this.AllowCookies = true;
            }
            else if (!this.AllowCookies)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.BasicHttpContextBindingRequiresAllowCookie, this.Namespace, this.Name));
            }
        }
 
        [DefaultValue(ContextBindingElement.DefaultContextManagementEnabled)]
        public bool ContextManagementEnabled
        {
            get
            {
                return this.contextManagementEnabled;
            }
            set
            {
                this.contextManagementEnabled = value;
            }
        }
 
        public override BindingElementCollection CreateBindingElements()
        {
            if (!this.AllowCookies)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.BasicHttpContextBindingRequiresAllowCookie, this.Namespace, this.Name)));
            }
 
            BindingElementCollection result;
            try
            {
                // Passing AllowCookies=false to HttpTransportBinding means we don't want transport layer to manage
                // cookie containers. We are going to do this at the context channel level, because we need channel 
                // level isolation as opposed to channel factory level isolation. 
 
                this.AllowCookies = false;
                result = base.CreateBindingElements();
            }
            finally
            {
                this.AllowCookies = true;
            }
            result.Insert(0, new ContextBindingElement(ProtectionLevel.None, ContextExchangeMechanism.HttpCookie, null, this.ContextManagementEnabled));
 
            return result;
        }
    }
}