Files
linux-packaging-mono/external/aspnetwebstack/src/System.Web.Http.SelfHost/Channels/HttpMessageEncodingBindingElement.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

141 lines
6.6 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Diagnostics.CodeAnalysis;
using System.ServiceModel.Channels;
using System.Web.Http.SelfHost.Properties;
namespace System.Web.Http.SelfHost.Channels
{
/// <summary>
/// Provides an <see cref="HttpMessageEncoderFactory"/> that returns a <see cref="MessageEncoder"/>
/// that is able to produce and consume <see cref="HttpMessage"/> instances.
/// </summary>
internal sealed class HttpMessageEncodingBindingElement : MessageEncodingBindingElement
{
private static readonly Type _replyChannelType = typeof(IReplyChannel);
/// <summary>
/// Gets or sets the message version that can be handled by the message encoders produced by the message encoder factory.
/// </summary>
/// <returns>The <see cref="MessageVersion"/> used by the encoders produced by the message encoder factory.</returns>
public override MessageVersion MessageVersion
{
get { return MessageVersion.None; }
set
{
if (value == null)
{
throw Error.ArgumentNull("value");
}
if (value != MessageVersion.None)
{
throw Error.NotSupported(SRResources.OnlyMessageVersionNoneSupportedOnHttpMessageEncodingBindingElement, typeof(HttpMessageEncodingBindingElement).Name);
}
}
}
/// <summary>
/// Returns a value that indicates whether the binding element can build a listener for a specific type of channel.
/// </summary>
/// <typeparam name="TChannel">The type of channel the listener accepts.</typeparam>
/// <param name="context">The <see cref="BindingContext"/> that provides context for the binding element</param>
/// <returns>true if the <see cref="IChannelListener{TChannel}"/> of type <see cref="IChannel"/> can be built by the binding element; otherwise, false.</returns>
[SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Existing public API")]
public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
{
return false;
}
/// <summary>
/// Returns a value that indicates whether the binding element can build a channel factory for a specific type of channel.
/// </summary>
/// <typeparam name="TChannel">The type of channel the channel factory produces.</typeparam>
/// <param name="context">The <see cref="BindingContext"/> that provides context for the binding element</param>
/// <returns>ALways false.</returns>
[SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Existing public API")]
public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
throw Error.NotSupported(SRResources.ChannelFactoryNotSupported, typeof(HttpMessageEncodingBindingElement).Name, typeof(IChannelFactory).Name);
}
/// <summary>
/// Returns a value that indicates whether the binding element can build a channel factory for a specific type of channel.
/// </summary>
/// <typeparam name="TChannel">The type of channel the channel factory produces.</typeparam>
/// <param name="context">The <see cref="BindingContext"/> that provides context for the binding element</param>
/// <returns>ALways false.</returns>
[SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Existing public API")]
public override bool CanBuildChannelListener<TChannel>(BindingContext context)
{
if (context == null)
{
throw Error.ArgumentNull("context");
}
context.BindingParameters.Add(this);
return IsChannelShapeSupported<TChannel>() && context.CanBuildInnerChannelListener<TChannel>();
}
/// <summary>
/// Initializes a channel listener to accept channels of a specified type from the binding context.
/// </summary>
/// <typeparam name="TChannel">The type of channel the listener is built to accept.</typeparam>
/// <param name="context">The <see cref="BindingContext"/> that provides context for the binding element</param>
/// <returns>The <see cref="IChannelListener{TChannel}"/> of type <see cref="IChannel"/> initialized from the context.</returns>
[SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Existing public API")]
public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
if (context == null)
{
throw Error.ArgumentNull("context");
}
if (!IsChannelShapeSupported<TChannel>())
{
throw Error.NotSupported(SRResources.ChannelShapeNotSupported, typeof(HttpMessageEncodingBindingElement).Name, typeof(IReplyChannel).Name);
}
context.BindingParameters.Add(this);
IChannelListener<IReplyChannel> innerListener = context.BuildInnerChannelListener<IReplyChannel>();
if (innerListener == null)
{
return null;
}
return (IChannelListener<TChannel>)new HttpMessageEncodingChannelListener(context.Binding, innerListener);
}
/// <summary>
/// Returns a copy of the binding element object.
/// </summary>
/// <returns>A <see cref="BindingElement"/> object that is a deep clone of the original.</returns>
public override BindingElement Clone()
{
return new HttpMessageEncodingBindingElement();
}
/// <summary>
/// Creates a factory for producing message encoders that are able to
/// produce and consume <see cref="HttpMessage"/> instances.
/// </summary>
/// <returns>
/// The <see cref="MessageEncoderFactory"/> used to produce message encoders that are able to
/// produce and consume <see cref="HttpMessage"/> instances.
/// </returns>
public override MessageEncoderFactory CreateMessageEncoderFactory()
{
return new HttpMessageEncoderFactory();
}
private static bool IsChannelShapeSupported<TChannel>()
{
return typeof(TChannel) == _replyChannelType;
}
}
}