如何以编程方式为WCF服务设置单个端点

时间:2010-01-13 19:14:31

标签: c# wcf endpoints

我正在尝试允许用户配置WCF服务,包括服务侦听的IP和端口号。用户有一个单独的配置应用程序,允许设置这些值,但我遇到的问题是app.config必须定义一个端点,以便创建一个新的ServiceHost条目...但我的端点正在在单独的配置文件中定义,然后必须在运行时以编程方式绑定。

如果我执行以下操作(基于How to programatically modify WCF app.config endpoint address setting?

        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();

服务将同时监听app.config中定义的URI和配置文件中定义的URI。我无法找到删除原始端点或创建没有定义端点的服务。

从配置应用程序写入app.config不是一个选项 - 我需要以编程方式从单独的XML配置文件中提取配置的值....

有什么想法吗?

编辑:该服务作为Windows服务运行并公开HTTP端点,它不作为IIS中托管的Web服务运行 - 如果它改变了一切

4 个答案:

答案 0 :(得分:2)

贾斯汀,

这对你有帮助吗?此代码将允许您响应您在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" %>

答案 1 :(得分:2)

嗯,我没有巨大的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();

答案 2 :(得分:1)

通过结合gWiz和Dylan的答案,我想出了一种方法来做到这一点,虽然我没有经过足够的测试,知道我是否已经破坏了这些变化的任何其他功能。

基本上,我添加了这个类:

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配置的端点

谢谢!

答案 3 :(得分:0)

你根本没有配置文件,我不相信 - 即你可以在代码中完成所有操作。如果你将这些内容保留在.config中,那么它将与你在代码中编写的内容一起使用。

如果你想要一个或另一个,我认为你必须删除其中一个。