У меня есть карманные компьютеры, которые должны связаться через basicHTTPBinding. У меня есть контракт, и все работает, как рекламируется.
Я должен развернуть его для легкой поддержки изменения на тестовую среду, обучения и конечно производства. Я следовал маршрутом порта, думая, что я мог выставить различные конечные точки с различиями в порте, и на основе порта, решить, от какой базы данных я хотел информацию.
Я, может казаться, не делаю эту работу и до сих пор не нашел информации нигде, которая указывает, что может быть сделана. Так как порт является дополнительным, это не может быть.
Кто-либо сделанный что-нибудь как это?
Хотя вы не можете делать то, что хотите с портом, вы можете сделать это другим путем. Например, добавление «/ 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
}
}