我正在尝试允许用户配置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服务运行 - 如果它改变了一切
答案 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中,那么它将与你在代码中编写的内容一起使用。
如果你想要一个或另一个,我认为你必须删除其中一个。