我有一个通用服务接口:
[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'不能 可以在合同列表中找到 由服务'服务'实施。
这是对接口的通用定义的影响。 任何解决方案?
答案 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();
}