0

我试图弄清楚将这个物体推到哪里:

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 />我们的每一项服务创建一个条目?

4

1 回答 1

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>您似乎想避免的部分。)

于 2015-07-03T04:22:09.227 回答