Как жестко закодировать конечную точку WCF по умолчанию для службы? - PullRequest
2 голосов
/ 07 апреля 2011

В автономном сервисе я хотел бы использовать конечную точку (точки), указанную в App.config, если она есть, или конечную точку по умолчанию, указанную в коде, если App.config пуст. Как я могу это сделать?

Редактировать : чтобы уточнить, это на стороне сервера (службы) с использованием ServiceHost.

Ответы [ 4 ]

2 голосов
/ 13 октября 2012

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

BasicHttpBinding binding = new BasicHttpBinding();
binding.Name = "BasicHttpBinding_ITaskService";
binding.CloseTimeout = TimeSpan.FromMinutes(1);
binding.OpenTimeout = TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = TimeSpan.FromMinutes(10);
binding.SendTimeout = TimeSpan.FromMinutes(1);
binding.AllowCookies = false;
binding.BypassProxyOnLocal = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MaxBufferSize = 65536;
binding.MaxBufferPoolSize = 524288;
binding.MaxReceivedMessageSize = 65536;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = System.Text.Encoding.UTF8;
binding.TransferMode = TransferMode.Buffered;
binding.UseDefaultWebProxy = true;
binding.Security.Mode = BasicHttpSecurityMode.None;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
binding.Security.Transport.Realm = "";
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;

Uri endPointAddress = new Uri("http://www.kapanbipan.com/TaskService.svc");
ChannelFactory<taskmgr.TaskService.ITaskServiceChannel> factory = new ChannelFactory<ITaskServiceChannel>(binding, endPointAddress.ToString());
taskmgr.TaskService.ITaskServiceChannel client = factory.CreateChannel();
2 голосов
/ 07 апреля 2011

Вы можете получить раздел конфигурации следующим образом:

var clientSection =  System.Configuration.ConfigurationManager.GetSection("system.serviceModel/client");

Если значение равно нулю или clientSection.Endpoints содержит ноль элементов, то оно не определено.

2 голосов
/ 07 апреля 2011

Одним из способов является try первая попытка загрузки из файла конфигурации и жесткое кодирование конечной точки в catch. EG:

MyServiceClient client = null;
try
{
    client = new MyServiceClient();
}
catch (InvalidOperationException)
{
    EndpointAddress defaultAddress = new EndpointAddress(...);
    Binding defaultBinding = new Binding(...);
    client = new MyServiceClient(defaultBinding, defaultAddress);
}
1 голос
/ 07 апреля 2011

Попробуйте это ... не проверено, но должно работать для вас.Он проверит вашу конфигурацию на наличие любых конечных точек с соответствующим контрактом.Вы можете изменить его так, чтобы он совпадал по имени, возвращал другую информацию или что-либо еще, что имеет смысл для вашей ситуации.Если совпадений не найдено, вы можете использовать логику для создания конечной точки по умолчанию.

    public List<EndpointAddress> GetEndpointAddresses(Type t)
    {
        string contractName = t.FullName;
        List<EndpointAddress> endpointAddresses = new List<EndpointAddress>();
        ServicesSection servicesSection = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection;

        foreach (ServiceElement service in servicesSection.Services)
        {
            foreach (ServiceEndpointElement endpoint in service.Endpoints)
            {
                if (string.Compare(endpoint.Contract, contractName) == 0)
                {
                    endpointAddresses.Add(new EndpointAddress(endpoint.Address));
                }
            }
        }

        if (endpointAddresses.Count == 0)
        {
            //TODO: Add logic to determine default
            endpointAddresses.Add(new EndpointAddress("Your default here"));
        }

        return endpointAddresses;
    }
...