2011-05-17 27 views
4

我對WCF中的託管服務存在一些疑問。瞭解使用ServiceHost類及其構造函數的WCF自託管方法

我想使用自託管方法託管服務。 ServiceHost班來救援。 通過使用它,可以託管可以直接訪問Windows主機框架的服務。 好了,請考慮以下方法:

0)共同假設:所有病例假設配置文件App.config是爲了設置終點ABC使用。所以在下面的代碼中沒有提到端點,只是不打擾它。 我們會考慮這項服務太:

[ServiceContract] 
public interface IMyService { 
    [OperationContract] 
    string MyOp1(int myint); 
    [OperationContract] 
    string MyOp2(int myint); 
} 
public class MyService : IMyService { 
    // This service needs to be constructed providing at least a string or an integer, if an attempt to construct it wothout passing any of these is done, the service should raise an error. 
    MyService(string strparam) { ... } 
    MyService(int intparam) { ... } 
    MyService(string strparam, int intparam) { ... } 
    public string MyOp1(int myint) { ... } 
    public string MyOp2(int myint) { ... } 
} 
public class MyStandaloneService : IMyService { 
    // This service does not need to be constructed. 
    MyStandaloneService() { ... } 
    public string MyOp1(int myint) { ... } 
    public string MyOp2(int myint) { ... } 
} 

1)案例1:有可能使用ServiceHost類的此重載託管服務:

public ServiceHost(
    Type serviceType, 
    params Uri[] baseAddresses 
) 

通過使用它,它是可能讓框架管理服務實例,因爲只需要服務類型。當然,如果服務是建設是基礎建設。 no參數構造函數將被調用。

using (ServiceHost host = new ServiceHost(typeof(MyStandaloneService))) { 
    host.Open(); 
    ... 
    host.Close(); 
} 

2)情形2:處理不需要特殊的施工服務...某種獨立的服務時,該超載好有可能主辦使用ServiceHost類的此重載服務:

public ServiceHost(
    Object singletonInstance, 
    params Uri[] baseAddresses 
) 

通過使用它,就可以實例化一個服務,然後主持它沒有讓框架處理這個...這個方法有需要特殊處理,並沒有完全獨立的服務打交道時是好的:

MyService MS = new MyService("the string"); 
using (ServiceHost host = new ServiceHost(MS)) { 
    host.Open(); 
    ... 
    host.Close(); 
} 

那麼我想了解以下信息:

A)在CASE 1也能夠通過提供的類型自動託管服務。如果我嘗試創建另一個相同類型的服務(MyStandaloneService),是否會因爲嘗試創建兩個相同的服務而導致錯誤?可能我應該硬編碼,在這種情況下,端點配置,因爲使用配置文件將導致兩個相同的服務託管在同一地址。

B)在CASE 2 MSDN文檔說這會創建一個單例服務實例。所以如果我嘗試以這種方式託管另一項服務:

MyService MS = new MyService("the string"); 
MyService MS2 = new MyService(23); 
ServiceHost host = new ServiceHost(MS)); 
ServiceHost host2 = new ServiceHost(MS2)); 
host.Open(); 
host2.Open(); 
... 
host.Close(); 
host2.Close(); 

我會收到錯誤嗎?

C)如果我想避免單例實例,我應該怎麼做?

感謝

回答

8

首先,你可能需要檢查出ServiceBehaviorAttribute MSDN文章。

我不贅述了,但你可以創建服務對象的一個​​實例來處理所有請求依次,也就是說,一前一後),或讓ServiceHost對象創建一個服務對象每個請求和處理它們在不同的線程同時

一旦你決定什麼方法最適合你的應用程序,你就會明白其中ServiceHost一個構造函數重載使用。你CASE 1相當於多實例同時處理辦法,並CASE 2相當於「一個實例來處理它們」的做法。

ServiceHost過載必須與MyService類中的[ServiceBehavior]屬性保持一致。所以,請查看我上面給出的鏈接。

編輯:現在回答你的問題:

A)如果我試圖創建同一類型(MyStandaloneService)的另一種服務,它導致一個錯誤,因爲試圖創建兩個相同的服務?

不,這是什麼將通過ServiceHost完成:它會創建每個請求的服務的一個實例(其實,每個會話,但再次閱讀MSDN

B)在CASE 2 MSDN文檔說這會創建服務的單例實例。所以如果我嘗試以這種方式託管另一項服務(...)我會得到一個錯誤嗎?

你不能一次託管兩個同一個ABC的服務,所以是的。如果您將它們託管在不同的端點上,則可以。這裏的'singleton'表示一個單個服務實例將處理所有請求。

C)如果我想避免單例實例,我應該怎麼做?

使用CASE 1方法:)

1

爲了得到一個所謂的非單服務的每個實例非默認構造函數,你應該看看IInstanceProvider。您可以使用ServiceBehaviorAttribute和InstanceContextMode = PerCall爲每個調用獲取一個新的服務對象,並且您的IInstanceProvider將用於獲取該對象,因此您可以執行任何需要的設置。