2014-03-07 28 views
6

我有以下代碼:如何替換ServiceContract和OperationContract的命名約定?

[ServiceContract(Name = "Save{0}")] 
public ISave<T> where T : BusinessObject 
{ 
    [OperationContract(Name = "Save")] 
    void Save(T obj); 
} 

public class SaveCustomer : ISave<Customer> 
{ 
    public void Save(Customer obj) { ... } 
} 

我的問題是,使用IIS我的WCF應用程序/ WAS不喜歡我給的名字。它不會自動填寫它。我看到這個stackoverflow question,它的答案爲爲什麼的名稱不會自動格式化。我沒有等待微軟允許格式化名稱,而是看到我是否可以用我自己的名字替換名稱的功能。

我只是不確定我需要延長(ServiceHostServiceHostFactoryDataContractSerializer,等)類,甚至我有什麼方法重寫以獲得更友好的名稱。另外,由於我甚至不知道我要創建什麼類,所以我不知道我的應用程序可以使用它(Global.asax成員?svc文件?屬性?)。

回答

1

答案似乎是,這不是真的需要。看來服務名稱是按照慣例創建的。如果您更改相應代碼:

[ServiceContract] // No use of the 'Name' property 
public ISave<T> where T : BusinessObject 
{ 
    [OperationContract(Name="Save")] 
    void Save(T obj); 
} 

public class SaveCustomer : ISave<Customer> 
{ 
    public void Save(Customer obj) { /* Do stuff here */ } 
} 

然後將得到的配置應該類似於web.config文件中的以下(假設basicHttpBinding):

<service name="SaveCustomer"> 
    <endpoint 
     address="http://localhost:8001/SaveCustomer/" 
     binding="basicHttpBinding" 
     contract="ISave`1[[FullyQualifiedNamespaceTo.Customer, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]" 
    /> 
</service> 

我發現這個here在評論中接受的答案。顯然,您需要提供您自己的程序集名稱,版本,文化和公鑰。如果你沒有PublicKeyToken,我相信你可以離開它。

所以,看來你ISave<T>界面上宣佈ServiceContractAttribute,然後實現在一個名爲SaveCustomer導致服務類,接口命名爲SaveCustomer(這是什麼,我相信你以後)。雖然在web.config文件中指定時,您可能不得不使用泛型類型的語法。

所以,如果你有其他服務類,例如:

public class SaveOrder : ISave<Order> 
{ 
    public void Save(Order obj) { /* Do stuff here */ } 
} 

,那麼你應該與其他服務端點配置結束:

<service name="SaveOrder"> 
    <endpoint 
     address="http://localhost:8001/SaveOrder/" 
     binding="basicHttpBinding" 
     contract="ISave`1[[FullyQualifiedNamespaceTo.Order, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]" 
    /> 
</service> 

HTH。