Как программно установить одну конечную точку для службы WCF - PullRequest
4 голосов
/ 13 января 2010

Я пытаюсь разрешить пользовательскую настройку службы WCF, включая IP-адрес и номер порта, который прослушивает служба. У пользователя есть отдельное приложение конфигурации, которое позволяет устанавливать эти значения, но проблема, с которой я сталкиваюсь, заключается в том, что app.config ДОЛЖЕН иметь определенную конечную точку для создания новой записи ServiceHost ... но моя конечная точка находится в процессе определяется в отдельном файле конфигурации и затем должен быть связан программно во время выполнения.

Если я сделаю следующее (на основе Как программно изменить настройку адреса конечной точки WCF app.config? :

        m_SvcHost = new ServiceHost(this);

        if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
        {
            m_SvcHost.AddServiceEndpoint(typeof(IMyService),
                new BasicHttpBinding(),
                Config.ServiceEndpoint);
        }

        m_SvcHost.Open();

служба будет прослушивать ОБА URI, определенный в app.config, И URI, определенный в файле конфигурации. Я не могу найти способ удалить исходную конечную точку или создать службу без определенной конечной точки.

Запись в app.config из приложения конфигурации невозможна - мне нужно программно извлекать настроенное значение из отдельного XML-файла конфигурации ....

есть мысли?

РЕДАКТИРОВАТЬ: служба работает как служба Windows и предоставляет конечную точку HTTP, она не работает как веб-служба, размещенная в IIS - если это вообще что-то меняет

Ответы [ 4 ]

2 голосов
/ 13 января 2010

Justin

Вам это помогает? Этот код позволит вам ответить на любой адрес, указанный в методе CreateServiceHost ().

public class CRSyncServiceHost : ServiceHost
{
    public CRSyncServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

public class CRSyncServiceFactory : ServiceHostFactory
{
    protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        Uri newServiceAddress = new Uri("http://someaddress.com/CRSyncService.svc");
        CRSyncServiceHost newHost = new CRSyncServiceHost(serviceType, newServiceAddress);
        return newHost;
    }
}

<%@ ServiceHost Language="C#" Debug="true" Service="CRSyncService" Factory="CRSyncServiceFactory" CodeBehind="CRSyncService.svc.cs" %>
2 голосов
/ 13 января 2010

Ну, у меня нет потрясающего опыта WCF, но будет ли это работать?

m_SvcHost = new ServiceHost(this);
m_SvcHost.Description.Endpoints.Clear(); // <-- added

if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
{
    m_SvcHost.AddServiceEndpoint(typeof(IMyService),
        new BasicHttpBinding(),
        Config.ServiceEndpoint);
}

m_SvcHost.Open();
1 голос
/ 13 января 2010

Объединив ответы как gWiz, так и Дилана, я нашел способ сделать это, хотя я недостаточно тщательно протестировал, чтобы узнать, не нарушил ли я какие-либо другие функции с этими изменениями.

В основном я добавил этот класс:

public class MobileMonitoringSvcHost : ServiceHost
{
    protected override void ApplyConfiguration()
    {
        // skip this line to not apply default config - unsure of other ramifications of doing this yet...
        base.ApplyConfiguration();

        base.Description.Endpoints.Clear();
    }

    public MobileMonitoringSvcHost(object singletonInstance, params Uri[] baseAddresses) : base(singletonInstance, baseAddresses)
    {

    }
}

Это пропускает вызов ServiceHost "ApplyConfiguration" и (вероятно, пока нет необходимости, потому что если конфигурация не загружена, не должно быть никаких конечных точек) очищает конечные точки. Затем я делаю следующее:

m_SvcHost = new MySvcHost(this);


        if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
        {
            //m_SvcHost.Description.Endpoints.Clear();


            m_SvcHost.AddServiceEndpoint(typeof(IMobileMonitoringSvc),
                new BasicHttpBinding(),
                Config.ServiceEndpoint);
        }


        // open the svchost and allow incoming connections
        m_SvcHost.Open();

Это приводит к тому, что служба прослушивает только внешнюю настроенную конечную точку, а не настроенную конечную точку app.config

Спасибо!

0 голосов
/ 13 января 2010

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

Если вы хотите одно или другое, я думаю, вам нужно удалить одно или другое.

...