我正在研究一个通用WCF主机,它扫描插件文件夹并加载实现类型的所有程序集" IWebService"
然后我使用Ninject开始托管wcf服务。 所有配置都在App.config中。
当只加载一个插件时,这很有用。
但是当我尝试启动第二个时,它会抛出一个异常,说明" URI已经存在注册"
我在App.config中定义了两个完全不同的服务,所以我真的很困惑。
这是App.config
<services>
<service name="GenericWebService.WebService" behaviorConfiguration="defaultBehavior">
<host>
<baseAddresses>
<!-- note, choose an available port-->
<add baseAddress="http://localhost:8092/GenericWebService/service" />
</baseAddresses>
</host>
<endpoint address="http://localhost:8092/GenericWebService/service" name="service1"
binding="basicHttpBinding" bindingConfiguration="soapBinding" contract="GenericWebService.ICalculator"/>
</service>
<service name="GenericWebService.WebService2" behaviorConfiguration="defaultBehavior">
<host>
<baseAddresses>
<!-- note, choose an available port-->
<add baseAddress="http://localhost:8093/GenericWebService2/service"/>
</baseAddresses>
</host>
<endpoint address="http://localhost:8093/GenericWebService2/service" name="service2"
binding="basicHttpBinding" bindingConfiguration="soapBinding" contract="GenericWebService.ICalculator2" />
</service>
</services>
以下是我如何加载它们并启动主机
private static void StartNinjectSelfHostFromPlugin(IEnumerable<IWebService> webServices )
{
foreach (var webService in webServices)
{
var ninjectType = (new NinjectServiceSelfHostFactory()).GetType();
var wcfConfiguration = typeof (NinjectWcfConfiguration)
.GetMethod("Create", Type.EmptyTypes)
.GetGenericMethodDefinition()
.MakeGenericMethod(new[]
{webService.GetType(),ninjectType })
.Invoke(null, new object[]{});
var x = new NinjectSelfHostBootstrapper(CreateKernel, wcfConfiguration);
_selfHostBootstrappers.Add(x);
x.Start();
}
}
任何建议都将不胜感激。
更新例外
System.InvalidOperationException: The ChannelDispatcher at 'http://localhost:809
2/GenericWebService/service' with contract(s) '"ICalculator"' is unable to open
its IChannelListener. ---> System.InvalidOperationException: A registration alre
ady exists for URI 'http://localhost:8092/GenericWebService/service'.
at System.ServiceModel.Channels.UriPrefixTable`1.RegisterUri(Uri uri, HostNama
eComparisonMode hostNameComparisonMode, TItem item)
at System.ServiceModel.Channels.HttpTransportManager.Register(TransportChanne
lListener channelListener)
at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListene
r channelListener)
at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTranspor
tManagersCallback selectTransportManagerCallback)
at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan time
out)
at System.ServiceModel.Channels.HttpChannelListener`1.OnOpen(TimeSpan timeout
)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
--- End of inner exception stack trace ---
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open()
at Ninject.Extensions.Wcf.SelfHost.NinjectWcfSelfHost.Start()
at Ninject.Web.Common.SelfHost.NinjectSelfHostBootstrapper.Start()
at TestApp.Program.StartNinjectSelfHostFromPlugin(IEnumerable`1 psoWebService
s) in c:\Users\william.davis\Documents\Visual Studio 2013\Projects\Service\TestA
pp\Program.cs:line 80
答案 0 :(得分:0)
经过大量的重构,我有这个工作,但我不知道它是否正确。&#39;为了使它工作,我必须基本上在我的webservice类中创建一个新的IKernel,并让它继承NinjectModule并在那里配置绑定。为什么我需要多个内核才能实现这一目标?我应该补充一点,如果我不需要Ninject,这可以使用标准的ServiceHost