#.net #wcf #endpoint #wcf-endpoint
#.net #wcf #конечная точка #wcf-endpoint
Вопрос:
В автономной службе я хотел бы использовать конечные точки, указанные в App.config, если они присутствуют, или конечную точку по умолчанию, указанную в коде, если App.config пуст. Как я могу это сделать?
Редактировать: чтобы пояснить, это делается на стороне сервера (службы) с использованием ServiceHost.
Ответ №1:
Одним из способов является try
первая попытка загрузки из файла конфигурации и жестко запрограммировать конечную точку в catch
. НАПРИМЕР:
MyServiceClient client = null;
try
{
client = new MyServiceClient();
}
catch (InvalidOperationException)
{
EndpointAddress defaultAddress = new EndpointAddress(...);
Binding defaultBinding = new Binding(...);
client = new MyServiceClient(defaultBinding, defaultAddress);
}
Комментарии:
1. Спасибо, но я искал код на стороне сервера. С таким же успехом можно было бы сделать это и на клиенте, я думаю 🙂
2. Если это служба самостоятельного размещения (т. Е. вы используете ServiceHost), то будет работать тот же метод.
Ответ №2:
Вы можете получить раздел конфигурации, как показано ниже:
var clientSection = System.Configuration.ConfigurationManager.GetSection("system.serviceModel/client");
Если значение равно нулю или clientSection.Endpoints
содержит нулевые элементы, то оно не определено.
Ответ №3:
Я столкнулся с такой же проблемой, когда хотел реализовать автономный клиент службы без файла 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();
Ответ №4:
Попробуйте это … непроверенное, но должно сработать для вас. Он проверит вашу конфигурацию на наличие любых конечных точек с соответствующим контрактом. Вы можете изменить ее, чтобы она соответствовала имени, возвращала другую информацию или что-то еще, что имеет смысл для вашей ситуации. Если совпадений не найдено, вы можете ввести логику для создания конечной точки по умолчанию.
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;
}