2015-07-01 67 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