2015-07-01 63 views
0

我试图找出其中以推这个对象:如何设置ServiceThrottlingBehavior为IIS托管WCF服务编程

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 />条目?

+0

您必须创建一个自定义'ServiceHost'和一个自定义'ServiceHostFactory',并告诉IIS使用它而不是默认的。然后,您可以以编程方式将行为添加到自定义主机。如果我有机会,我会在稍后发布一个例子。 – Tim

+0

@Tim谢谢,如果你有一个例子,或者可以指给我一个很棒的例子! – BVernon

+0

我确实有一个例子,但我可能无法在今晚晚些时候发布它(我在美国西海岸)。 – Tim

回答

1

执行此操作的一种方法是使用.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>部分。)

+0

我想'base.ApplyConfiguration();'应该在方法的末尾。否则,它会给出错误。 – BVernon