C# 在IIS上托管WCF web服务时显式调用服务构造函数
我想在Microsoft IIS上托管我的WCF服务(IIS托管) 为此,我创建了我的服务:C# 在IIS上托管WCF web服务时显式调用服务构造函数,c#,.net,wcf,web-services,iis,C#,.net,Wcf,Web Services,Iis,我想在Microsoft IIS上托管我的WCF服务(IIS托管) 为此,我创建了我的服务: // The service public class MyService : IMyService { // Ctors public MyService() { // Def ctor: I don't want to call it } public MyService(...) : this() { // Parametric ct
// The service
public class MyService : IMyService {
// Ctors
public MyService() {
// Def ctor: I don't want to call it
}
public MyService(...) : this() {
// Parametric ctor, I want to call it!
}
...
}
// The contract
[ServiceContract]
public interface IMyService {
...
}
<@ServiceHost Service="MyService" @>
我创建了一个svc文件(为我的服务提供基址的好方法):
但这样做时,当托管我的服务时(只需在IIS中创建一个虚拟目录,指向我的应用程序所在的文件夹,通常是项目目录),IIS将调用默认构造函数
如何使IIS调用其他构造函数
PS:我知道可以指定一个HostServiceFactory
。这是我应该用的东西吗?它还给了我工厂和主人。对于主机,我无法对主机传递的参数执行操作。但是,我如何解决这个问题
注意:我知道很多解决方案都是基于(IoC)和几个IoC框架的,比如,和。然而,我根本不会真正使用它们。你能自己做吗?我不能接受WCF不能让程序员通过以适当的方式构造服务来承载服务…您必须编写几个自定义类来支持创建带有参数的服务:
- 自定义类实现
。此类将负责使用非默认构造函数创建服务实例IInstanceProvider
- 实现IServiceBehavior的自定义类。此类将负责将自定义实例提供程序添加到端点调度程序中
- 将应用您的行为的自定义
ServiceHost
- 自定义
,它将实例化您的自定义服务主机。您将从.svc文件引用此工厂ServiceHostFactory
这通常与构建对依赖项注入的支持相同。例如,您可以检查。查看一下(我在生产中使用这个),或者如果您只需要在您的服务中调用特定的构造函数,那么您只需要实现一个
IInstanceProvider
并将IServiceBehavior
附加到您的服务:
安装提供商
IServiceBehavior作为属性
更多信息请点击此处:
public class ServiceInstanceProvider : IInstanceProvider
{
public object GetInstance(InstanceContext instanceContext)
{
return this.GetInstance(instanceContext, null);
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
return new MyService(...);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{}
}
public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
if (!ed.IsSystemEndpoint)
{
ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider();
}
}
}
}
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{}
}
[InstanceProviderBehavior]
public class MyService : IMyService {
public MyService() { }
public MyService(...) : this() {
...
}
...
}