Чтение элементов поведения WCF из файла config programmticlally при предоставлении резидентной службы
у меня есть эта конфигурация в моем приложении.config:
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
Я хочу предоставить эту услугу программно из моего настольного приложения:
Я определяю экземпляр узла:
ServiceHost host = new ServiceHost(typeof(MyType), new Uri("http://" + hostName + ":" + port + "/MyName"));
затем я добавляю конечную точку с привязкой:
var binding = new BasicHttpBinding("myBinding");
host.AddServiceEndpoint(typeof(IMyInterface), binding, "MyName");
теперь я хочу заменить следующий код некоторым кодом, который читает поведение с именем myBehavior из файла конфигурации , и не жестко-кодирование вариантов поведения.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior() { HttpGetEnabled = true };
host.Description.Behaviors.Add(smb);
// Enable exeption details
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.IncludeExceptionDetailInFaults = true;
тогда, я могу открыть хост.
host.Open();
* EDIT*
Настройка Служб С Помощью Файлов Конфигурации
вам не нужно таким образом, вы должны сделать хост автоматически берет свою конфигурацию из файла конфигурации, а не давать их вручную, читать эта статья (настройка служб с помощью файлов конфигурации), это будет помогите вам, я разместил свой сервис в одной строке на C# и несколько в config.
Это вторая статья о (настройка служб WCF в коде), моя вина в том, что я пытался смешать два пути!
я добавлю это в качестве ответа.
3 ответов
во-первых, вам нужно открыть файл конфигурации с помощью
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
или
var map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "app.config";
var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
затем вы читаете поведения:
var bindings = BindingsSection.GetSection(config);
var group = ServiceModelSectionGroup.GetSectionGroup(config);
foreach (var behavior in group.Behaviors.ServiceBehaviors)
{
Console.WriteLine ("BEHAVIOR: {0}", behavior);
}
обратите внимание, что они имеют тип System.ServiceModel.Configuration.ServiceBehaviorElement
, так что не совсем то, что вы хотите сделать.
если вы не возражаете использовать частный API, вы можете вызвать защищенный метод BehaviorExtensionElement.CreateBehavior()
через отражение:
foreach (BehaviorExtensionElement bxe in behavior)
{
var createBeh = typeof(BehaviorExtensionElement).GetMethod(
"CreateBehavior", BindingFlags.Instance | BindingFlags.NonPublic);
IServiceBehavior b = (IServiceBehavior)createBeh.Invoke(bxe, new object[0]);
Console.WriteLine("BEHAVIOR: {0}", b);
host.Description.Behaviors.Add (b);
}
Настройка Служб С Помощью Файлов Конфигурации
вам не нужно таким образом, вы должны сделать хост автоматически берет свою конфигурацию из файла конфигурации, а не давать их вручную, читать эта статья (настройка служб с помощью файлов конфигурации), это поможет вам, я разместил свой сервис в одной строке на C# и несколько в config.
Это вторая статья о (настройка служб WCF в Код), моя вина в том, что я пытался смешать два пути!
хотя это старый вопрос, у меня были проблемы с поиском того, что мне нужно в другом месте, поэтому для дальнейшего использования вот мое решение.
var behaviorSection = ConfigurationManager.GetSection("system.serviceModel/behaviors") as BehaviorsSection;
if (behaviorSection != null)
{
// for each behavior, check for client and server certificates
foreach (EndpointBehaviorElement behavior in behaviorSection.EndpointBehaviors)
{
foreach (PropertyInformation pi in behavior.ElementInformation.Properties)
{
if (pi.Type == typeof(ClientCredentialsElement))
{
var clientCredentials = pi.Value as ClientCredentialsElement;
var clientCert = clientCredentials.ClientCertificate;
// TODO: Add code...
}
}
}
}
ConfigurationManager.Open...Configuration()
не работает хорошо с веб-проектами, поэтому вручную получить раздел и кастинг проще.
если вы действительно настаиваете на том, чтобы System.ServiceModel
сделайте Чтение конфигурации для вас можно сделать что-то вроде этого:
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = System.IO.Path.Combine(HttpContext.Current.Server.MapPath("~"), "web.config"); // the root web.config
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var group = ServiceModelSectionGroup.GetSectionGroup(config);
foreach (EndpointBehaviorElement item in group.Behaviors.EndpointBehaviors)
{
// TODO: add code...
}
2-й метод использует HttpContext.Current
, а как мы все знаем HttpContext.Current
is ужасно при выполнении модульных тестов.