2011-06-03 54 views
4

我有一個通用的服務接口:通用服務接口

[ServiceContract] 
public interface IService<T> where T : Class1 
{ 
    [OperationContract] 
    void DoWork(T class1); 
} 

然後,我有一個具體的服務,從繼承:

public class Service : IService<Class1> 
{ 
    public void DoWork(Class1 class1) 
    { 
    } 
} 

一切工作正常,直到我加入webHttpEndpoint揭露一個JSON WS:

<service name="Service"> 
    <endpoint 
     address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="webHttpBehavior" 
     contract="IService" /> 
</service> 

<behavior name="webHttpBehavior"> 
    <enableWebScript /> 
</behavior> 

事實上,我收到此錯誤:

The contract name 'IService' could not be found in the list of contracts implemented by the service 'Service'.

這就是接口的通用定義。 任何解決方案?

+2

那麼,你的'Service' **不**執行'IService'(如錯誤明說) - 它實現了'IService ' - 這是一個不同的接口.... – 2011-06-03 07:11:52

+0

感謝您的答案。我怎樣才能在我的web.config中設置? – user758977 2011-06-03 07:25:08

+0

你可以嘗試使用'contract =「IService 」'但我恐怕這是行不通的。 WCF不太適合仿製藥..... – 2011-06-03 07:29:33

回答

0

哪裏是你的Class1 .....而是指定任何特定類的使用class

試試這個引用類型...

[ServiceContract]public interface IService<T> where T : class 
    { 
     [OperationContract] 
     void DoWork(); 
    } 
+0

感謝您的回答。同樣的錯誤。 – user758977 2011-06-03 07:25:18

3

在我看來(基於你說什麼),接口不需要是通用的。調用者只需要知道有一個DoWork操作。

所以基本上,改變具體類是通用的而不是界面。澄清這個問題後

public class Service<T> : IService where T : Class1 
{ 
    public void DoWork() 
    { 
    } 
} 

編輯:您需要提供在配置文件中的泛型參數,以及:

contract="YourAssembly.IService`1[[YourAssembly.Class1, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" 

這裏有一個類似的問題:Inheriting from a generic contract in WCF

+0

感謝您的回答。編輯這個問題:-) – user758977 2011-06-03 07:45:01

+0

編輯我的答案以及。 :) – 2011-06-03 08:19:37

+0

再次感謝。我的合同現在看起來像這樣:contract =「WebApplication1.IService'1 [[WebApplication1.Class1,WebApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]」但它不起作用。 – user758977 2011-06-03 09:51:41

2

你必須正確地寫入將您的合同的名稱輸入到配置中。 IService不是名稱IService<Class1> !!!

的配置應該是這樣的:

<service name="Service"> 
    <endpoint 
     address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="webHttpBehavior" 
     contract="IService`1[Class1]" /> 
</service> 

<behavior name="webHttpBehavior"> 
    <enableWebScript /> 
</behavior> 

請注意,如果您的合同或服務生活在任何命名空間,命名空間應列入配置。

或全部名稱的情況下,需要:

<service name="Namespace.Service, AssemblyName"> 
    <endpoint 
     address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="webHttpBehavior" 
     contract="Namespace.IService`1[[Namespace.Class1, AssemblyName]], AssemblyName" /> 
</service> 

<behavior name="webHttpBehavior"> 
    <enableWebScript /> 
</behavior> 
+0

感謝您的回答。同樣的錯誤。你能給我一個真實的例子嗎? – user758977 2011-06-03 11:27:55

+0

完整的類型名稱也沒有爲我工作,仍然WCF找不到合同。 – AndiDog 2012-01-22 19:50:40