繁体   English   中英

如何以编程方式为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 />创建<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>部分,您似乎希望避免该部分。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM