如何以编程方式为 IIS 托管的 WCF 服务设置 ServiceThrottlingBehavior
How to set ServiceThrottlingBehavior for IIS hosted WCF service programmatically
我正在想办法把这个对象推到哪里:
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior
{
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
};
我在 web.config 中找到了有关如何配置它的信息,但我对此有点困惑。我们的 web.config 中曾经有这样的东西:
<service name="AuthenticationService.AuthenticationService" behaviorConfiguration="Development">
<endpoint address="http://services.local/0.0.0.5/AuthenticationService.svc"
binding="basicHttpBinding"
bindingConfiguration="TUPSOAPBinding"
contract="AuthenticationService.ServiceDomain.ISecurityService"
name="SOAPCatalogService" />
</service>
如果我们仍然使用它,我会确切地知道如何通过 web.config 配置节流,但我们发现我们可以将所有这些端点从 web.config 中取出并且一切仍然有效并且它的维护工作更少,因为我们不必再为不同的版本和环境更新地址。
我还找到了有关如何以编程方式在 ServiceHost 上进行设置的信息,但我不是以编程方式创建 ServiceHost。我让 IIS 来处理。
那么,有没有一种编程方式可以让我在没有 web.config 且无需自己创建 ServiceHost 的情况下设置节流?
编辑:或者我是否可以在 web.config 中执行此操作而不必为我们的每一项服务创建 <service />
条目?
一种方法是使用 .svc 文件中的标记来指示 IIS 使用您的自定义服务主机和自定义服务主机工厂。为此,您当然需要有一个自定义服务主机。例如:
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
public class MyServiceHost : ServiceHost
{
public MyServiceHost()
: base() { }
public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses) { }
public MyServiceHost(object singletonInstance, params Uri[] baseAddresses)
: base(singletonInstance, baseAddresses) { }
protected override void OnClosing()
{
base.OnClosing();
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
this.Description.Behaviors.Add(new ServiceThrottlingBehavior
{
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
});
}
}
上面的关键点是覆盖ApplyConfiguration()
,您可以在其中将您的ServiceThrottlingBehavior
添加到自定义服务主机。
IIS 将使用 ServiceHostFactory
实例化 MyServiceHost
,因此您还将创建一个自定义服务宿主工厂,如下所示:
public class MyServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, params Uri[] baseAddresses)
{
return new MyServiceHost(serviceType, baseAddresses);
}
}
以上代码将创建您的自定义服务主机的实际实例。
最后一步是更改 .svc 文件的标记以使用您的自定义服务主机和工厂:
<%@ ServiceHost Langauge="C#" Service="MyCompany.MyService"
CodeBehind="MyService.svc.cs" Factory="MyCompany.MyServiceHostFactory" %>
服务名称需要是服务的完全限定名称,工厂也需要是自定义服务主机工厂的完全限定名称。
显然,您可以向您的自定义服务主机添加很多东西(我们有监控和错误处理)。这最初是在 .NET 3.5 中完成的,因此在 4.0/4.5 中可能有更新或额外的方法来执行此操作(例如,我知道您可以在配置文件中指定工厂以进行无文件激活,但那将进入<system.serviceModel>
部分,你似乎想避免。)
我正在想办法把这个对象推到哪里:
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior
{
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
};
我在 web.config 中找到了有关如何配置它的信息,但我对此有点困惑。我们的 web.config 中曾经有这样的东西:
<service name="AuthenticationService.AuthenticationService" behaviorConfiguration="Development">
<endpoint address="http://services.local/0.0.0.5/AuthenticationService.svc"
binding="basicHttpBinding"
bindingConfiguration="TUPSOAPBinding"
contract="AuthenticationService.ServiceDomain.ISecurityService"
name="SOAPCatalogService" />
</service>
如果我们仍然使用它,我会确切地知道如何通过 web.config 配置节流,但我们发现我们可以将所有这些端点从 web.config 中取出并且一切仍然有效并且它的维护工作更少,因为我们不必再为不同的版本和环境更新地址。
我还找到了有关如何以编程方式在 ServiceHost 上进行设置的信息,但我不是以编程方式创建 ServiceHost。我让 IIS 来处理。
那么,有没有一种编程方式可以让我在没有 web.config 且无需自己创建 ServiceHost 的情况下设置节流?
编辑:或者我是否可以在 web.config 中执行此操作而不必为我们的每一项服务创建 <service />
条目?
一种方法是使用 .svc 文件中的标记来指示 IIS 使用您的自定义服务主机和自定义服务主机工厂。为此,您当然需要有一个自定义服务主机。例如:
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
public class MyServiceHost : ServiceHost
{
public MyServiceHost()
: base() { }
public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses) { }
public MyServiceHost(object singletonInstance, params Uri[] baseAddresses)
: base(singletonInstance, baseAddresses) { }
protected override void OnClosing()
{
base.OnClosing();
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
this.Description.Behaviors.Add(new ServiceThrottlingBehavior
{
MaxConcurrentSessions = 100,
MaxConcurrentCalls = 100,
MaxConcurrentInstances = 100
});
}
}
上面的关键点是覆盖ApplyConfiguration()
,您可以在其中将您的ServiceThrottlingBehavior
添加到自定义服务主机。
IIS 将使用 ServiceHostFactory
实例化 MyServiceHost
,因此您还将创建一个自定义服务宿主工厂,如下所示:
public class MyServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, params Uri[] baseAddresses)
{
return new MyServiceHost(serviceType, baseAddresses);
}
}
以上代码将创建您的自定义服务主机的实际实例。
最后一步是更改 .svc 文件的标记以使用您的自定义服务主机和工厂:
<%@ ServiceHost Langauge="C#" Service="MyCompany.MyService"
CodeBehind="MyService.svc.cs" Factory="MyCompany.MyServiceHostFactory" %>
服务名称需要是服务的完全限定名称,工厂也需要是自定义服务主机工厂的完全限定名称。
显然,您可以向您的自定义服务主机添加很多东西(我们有监控和错误处理)。这最初是在 .NET 3.5 中完成的,因此在 4.0/4.5 中可能有更新或额外的方法来执行此操作(例如,我知道您可以在配置文件中指定工厂以进行无文件激活,但那将进入<system.serviceModel>
部分,你似乎想避免。)