Возможный иметь тот же контракт, ту же привязку, тот же адрес, но различные порты?

У меня есть карманные компьютеры, которые должны связаться через basicHTTPBinding. У меня есть контракт, и все работает, как рекламируется.

Я должен развернуть его для легкой поддержки изменения на тестовую среду, обучения и конечно производства. Я следовал маршрутом порта, думая, что я мог выставить различные конечные точки с различиями в порте, и на основе порта, решить, от какой базы данных я хотел информацию.

Я, может казаться, не делаю эту работу и до сих пор не нашел информации нигде, которая указывает, что может быть сделана. Так как порт является дополнительным, это не может быть.

Кто-либо сделанный что-нибудь как это?

5
задан abatishchev 30 May 2012 в 19:26
поделиться

1 ответ

Хотя вы не можете делать то, что хотите с портом, вы можете сделать это другим путем. Например, добавление «/ prod» или «/ test» к вашему базовому адресу. Я привел пример, иллюстрирующий это.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFTest
{
    class Program
    {
        static void Main()
        {
            List<Uri> baseAddresses = new List<Uri> { new Uri("http://localhost:1000/Prod"), new Uri("http://localhost:1000/Test") };
            ServiceHost wcfHost = new ServiceHost(typeof(SimpleWCF), new Uri[] {new Uri("http://localhost:1000")});

            foreach (ServiceEndpoint endpoint in SimpleWCF.CreateEndpoints(baseAddresses.ToArray()))
            {
                wcfHost.AddServiceEndpoint(endpoint);
            }

            ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
            metadataBehavior.HttpGetEnabled = true;
            wcfHost.Description.Behaviors.Add(metadataBehavior);

            wcfHost.Open();
            Console.ReadLine();
            wcfHost.Close();
        }
    }

    [ServiceContract]
    public interface ISimpleWCF
    {
        [OperationContract]
        string TestMethod();
    }

    public class SimpleWCF : ISimpleWCF
    {
        /// <summary>
        /// Thread Synchronization Object.
        /// </summary>
        private static readonly object _syncRoot = new object();

        /// <summary>
        /// Static Instance of Class.
        /// </summary>
        private static volatile SimpleWCF _current;

        /// <summary>
        /// Initializes a new instance of the <see cref="WebDataExchange"/> class.
        /// </summary>
        public SimpleWCF()
        {
            this.Contract = ContractDescription.GetContract(typeof(ISimpleWCF), GetType());
        }

        /// <summary>
        /// Gets or sets the contract.
        /// </summary>
        /// <value>The contract.</value>
        private ContractDescription Contract { get; set; }

        /// <summary>
        /// Gets the current instance of the SimpleWCF Object.
        /// </summary>
        /// <value>The current SimpleWCF Object.</value>
        public static SimpleWCF Current
        {
            get
            {
                if (_current != null)
                {
                    return _current;
                }

                lock (_syncRoot)
                {
                    if (_current == null)
                        _current = new SimpleWCF();

                }

                return _current;
            }
        }

        /// <summary>
        /// Creates an Enpoint Collection.
        /// </summary>
        /// <param name="addresses">The addresses.</param>
        /// <returns>A Collection of ServiceEndpoints.</returns>
        public static Collection<ServiceEndpoint> CreateEndpoints(Uri[] addresses)
        {
            Collection<ServiceEndpoint> endpointCollection = new Collection<ServiceEndpoint>();

            foreach (Uri uriAddress in addresses)
            {
                EndpointAddress address = new EndpointAddress(uriAddress);

                BasicHttpSecurityMode securityMode = address.Uri.Scheme == Uri.UriSchemeHttps ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None;
                BasicHttpBinding endpointBinding = new BasicHttpBinding(securityMode);

                ServiceEndpoint endpoint = new ServiceEndpoint(Current.Contract, endpointBinding, address);
                endpoint.ListenUriMode = ListenUriMode.Explicit;
                endpointCollection.Add(endpoint);
            }

            return endpointCollection;
        }

        #region ISimpleWCF Members

        string ISimpleWCF.TestMethod()
        {
            if (OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri.EndsWith("Prod"))
                return "Hello Prod!";
            else return "Hello Test!";
        }

        #endregion
    }

}
6
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: