InfoCardMetadataExchangeClient.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / infocard / Service / managed / Microsoft / InfoCards / InfoCardMetadataExchangeClient.cs / 2 / InfoCardMetadataExchangeClient.cs

                            //------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------
namespace Microsoft.InfoCards
{ 
    using System;
    using System.ServiceModel; 
    using System.ServiceModel.Channels; 
    using System.ServiceModel.Description;
    using System.Net; 
    using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
    using System.IO;
    using System.Text;
 
    internal class InfoCardMetadataExchangeClient :MetadataExchangeClient
    { 
        HttpWebRequest m_currentHttpGetRequest; 
        object m_abortSync;
        bool m_aborted; 
        IWebProxy m_proxy;

        //
        // Summary: 
        // Creates a HttpsTransportBindingelement for mex interactions
        // 
        // Remarks: 
        // We are manually creating a CustomBinding as opposed to relying on
        // new WSHttpBinding( SecurityMode.Transport ) ); which sets AuthenticationScheme 
        // to Negotiate by default. Another difference is that new WSHttpBinding inserts
        // a irrelevant TransactionFlowBindingElement. This is "irrelevant" because
        // TransactionFlowBindingElement doesn't yield a channel when Transactions = false.
        // See CSDMain 7086 for details. 
        //
        // Remarks: We're setting httpTransportBinding.AuthenticationScheme to Anonymous 
        // for all legs including IP/STS leg 
        //
        public static CustomBinding CreateBindingForMex() 
        {
            HttpsTransportBindingElement httpsTransport = new HttpsTransportBindingElement();

            IDT.Assert( 
                AuthenticationSchemes.Anonymous == httpsTransport.AuthenticationScheme,
                "AuthenticationScheme must be Anonymous and not NTLM/Negotiate" ); 
 
            CustomBinding httpsBinding = new CustomBinding(
                new TextMessageEncodingBindingElement(), //the same encoding used when WsHttpBinding is used 
                httpsTransport );

            return httpsBinding;
 
        }
 
 

        public InfoCardMetadataExchangeClient() 
            : base( CreateBindingForMex() )
        {
            //
            // We enforce CardSpace restrictions on the WSHttpBinding binding 
            // in the GetChannelFactory override
            // 
 
            m_abortSync = new object();
        } 

        public IWebProxy Proxy
        {
            set { m_proxy = value; } 
        }
 
        public void Abort() 
        {
            lock( m_abortSync ) 
            {
                if( null != m_currentHttpGetRequest )
                {
                    m_currentHttpGetRequest.Abort(); 
                }
                else 
                { 
                    ChannelFactory factory = base.GetChannelFactory(null,null,null);
                    if( null != factory ) 
                    {
                        factory.Abort();
                    }
                } 
                m_aborted = true;
            } 
        } 

        protected internal override HttpWebRequest GetWebRequest( System.Uri location, string dialect, string identifier ) 
        {
            if( 0 != String.Compare( location.Scheme, "https", StringComparison.OrdinalIgnoreCase  ) )
            {
                 throw IDT.ThrowHelperError( new TrustExchangeException( 
                    SR.GetString( SR.NonHttpsURIFound, location.AbsoluteUri ) ) );
            } 
 
            HttpWebRequest request = base.GetWebRequest( location, dialect, identifier );
 
            IDT.Assert( null == request.Credentials, "No creds should be set" );

            IDT.Assert( null != m_proxy, "Set the proxy value before creating a WebRequest" );
 
            request.Proxy = m_proxy;
 
            lock( m_abortSync ) 
            {
                // 
                // if we are already in an aborted state, ensure that the next request automatically aborts.
                //
                if( m_aborted )
                { 
                    request.Abort();
 
                } 
                return (m_currentHttpGetRequest = request);
            } 
        }

        protected internal override ChannelFactory GetChannelFactory( EndpointAddress metadataAddress, string dialect, string identifier )
        { 
            if( null != metadataAddress && 0 != String.Compare( metadataAddress.Uri.Scheme, "https", StringComparison.OrdinalIgnoreCase ) )
            { 
                throw IDT.ThrowHelperError( new TrustExchangeException( 
                   SR.GetString( SR.NonHttpsURIFound, metadataAddress.Uri.AbsoluteUri ) ) );
            } 

            IDT.Assert( null != m_proxy, "Set the proxy value before creating a WebRequest" );

            ChannelFactory factory =  base.GetChannelFactory( metadataAddress, dialect, identifier ); 

            // 
            // Can't set factory.Credentials.Windows.AllowNtlm = false; 
            // Exception thrown that the factory.Credentials.Windows
            // "Object is immutable". 
            //
            // WCF makes it read-only after the first leg in federation chain.
            // This is probably to ensure that settings on the channelFactory do not
            // change when multiple channels are created from the same channelFactory. 
            // This happens specifically in ChannelFactory.Open() (which can be triggered by opening a
            // channel created by the factory) 
            // 

            factory.Endpoint.Binding = new CustomBinding( 
                Utility.UpdateProxyForHttpAndRestrictTransportBinding(
                    factory.Endpoint.Binding.CreateBindingElements(),
                    m_proxy,
                    true ) ); // Client auth on transport should be turned off for mex. 

            lock( m_abortSync ) 
            { 
                //
                // if we are already in an aborted state, ensure that the next request automatically aborts. 
                //
                if( m_aborted )
                {
                    factory.Abort(); 
                }
            } 
            return factory; 
        }
    } 

}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK