通用服务接口

时间:2011-06-03 06:47:41

标签: wcf

我有一个通用服务接口:

[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>

事实上,我收到了这个错误:

  

合同名称'IService'不能   可以在合同列表中找到   由服务'服务'实施。

这是对接口的通用定义的影响。 任何解决方案?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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> 

答案 2 :(得分:0)

您的Class1在哪里.....使用class

而不是指定任何特定类使其成为引用类型

尝试一下......

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