File: MessageInspectorTestHelpers.cs
Web Access
Project: src\src\System.Private.ServiceModel\tests\Scenarios\Client\ClientBase\Client.ClientBase.IntegrationTests.csproj (Client.ClientBase.IntegrationTests)
using System;
using System.Collections.Generic;
using System.Net;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using Infrastructure.Common;
using TestTypes;
 
namespace ClientMessageInspector
{
    public enum AuthenticationType
    {
        None,
        Live
    }
 
    public class MI_ClientBase_ClientAuth : MI_ClientBase<IUser>
    {
        public MI_ClientBase_ClientAuth(string authType, string accessToken, BasicHttpBinding binding, EndpointAddress endPoint)
            : base(authType, accessToken, binding, endPoint)
        {
        }
 
        public ResultObject<string> GetAuthToken()
        {
            return base.Call<ResultObject<string>>(delegate
            {
                return this.Channel.UserGetAuthToken();
            });
        }
 
        public Dictionary<string, string> ValidateHeaders()
        {
            return this.Channel.ValidateMessagePropertyHeaders();
        }
    }
 
    public class MI_ClientBase<T> : ClientBase<T> where T : class
    {
        public MI_ClientBase(string authType, string accessToken, BasicHttpBinding binding, EndpointAddress endPoint)
            : base(binding, endPoint)
        {
            base.Endpoint.EndpointBehaviors.Add(new ClientAuthorizationBehavior(authType, accessToken));
        }
 
        public TResult Call<TResult>(Func<TResult> action) where TResult : class
        {
            try
            {
                using (new OperationContextScope((IContextChannel)base.InnerChannel))
                {
                    return action();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
 
    public class ClientAuthorizationBehavior : IEndpointBehavior
    {
        private readonly string _accessToken;
        private readonly string _authenticationType;
 
        public ClientAuthorizationBehavior(string authenticationType, string accessToken)
        {
            _accessToken = "";
            _authenticationType = "";
            _accessToken = accessToken;
            _authenticationType = authenticationType;
        }
 
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }
 
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(new ClientMessageInspector(_authenticationType, _accessToken));
        }
 
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }
 
        public void Validate(ServiceEndpoint endpoint)
        {
        }
    }
 
    public class ClientMessageInspector : IClientMessageInspector
    {
        private string _accessToken;
        private string _authenticationType;
 
        public ClientMessageInspector(string authenticationType, string accessToken)
        {
            _authenticationType = "";
            _accessToken = "";
            _authenticationType = authenticationType;
            _accessToken = accessToken;
        }
 
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
        }
 
        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            HttpRequestMessageProperty property;
            object obj2;
            if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out obj2))
            {
                property = obj2 as HttpRequestMessageProperty;
                property.Headers["authType"] = _authenticationType;
                property.Headers[HttpRequestHeader.Authorization] = _accessToken;
            }
            else
            {
                property = new HttpRequestMessageProperty();
                property.Headers["authType"] = _authenticationType;
                property.Headers[HttpRequestHeader.Authorization] = _accessToken;
                request.Properties.Add(HttpRequestMessageProperty.Name, property);
            }
            return null;
        }
    }
}