|
//------------------------------------------------------------
// 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;
}
}
}
|