Service实现多个ServiceContract类型,然后Restful Service抛出ServiceActivationException

时间:2012-09-26 18:42:24

标签: wcf rest autofac

因此,由于一些问题,我将最初的单一接口合同分成两个独立的合同。现在,我只有一个类(部分)实现两个接口,我想通过WCF将它们全部作为REST服务提供。合同列在下面。

我正在使用Autofac作为WCF服务主机。

以下是我的.svc文件代码

对于WCF服务:Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"

对于RESTful服务:Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf"

WCF示例

对于wcf服务

public interface IEmployeeCommandService {}
public interface IEmployeeQueryService {}
public partial class EmployeeService : IEmployeeCommandService {}
public partial class EmployeeService : IEmployeeQueryService {}
public partial class EmployeeService {}

我的Web.config文件如下所示

<service behaviorConfiguration="ServiceBehavior" name="Application.EmployeeService">
    <endpoint address="" binding="basicHttpBinding" contract="Application.IEmployeeCommandService" />
    <endpoint address="" binding="basicHttpBinding" contract="Application.IEmployeeQueryService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

我的 EmployeeService.svc 代码看起来像

<%@ ServiceHost Service="Application.EmployeeService, Application"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"%>

使用这种方法,普通的WCF服务对我来说很好。浏览 EmployeeService.svc 时,我可以看到命令&amp;查询服务操作。

Simillar方法我正在尝试RESTFul服务,如下所述。但是当我浏览我的RESTFul服务时,我收到了错误。

RESTFul示例

public interface IEmployeeRESTfulQueryService {}
public interface IEmployeeRESTfulCommandService {}
public partial class EmployeeRESTfulService {}
public partial class EmployeeRESTfulService : IEmployeeRESTfulCommandService {}
public partial class EmployeeRESTfulService : IEmployeeRESTfulQueryService {}

我的web.confing如下所示

  <service behaviorConfiguration="ServiceBehavior" name="Application.EmployeeRESTfulService">
    <endpoint name="Command" address="Command" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="Application.IEmployeeRESTfulCommandService" />
    <endpoint name="Query" address="Query" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="Application.IEmployeeRESTfulQueryService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

<behavior name="webHttp">
 <webHttp helpEnabled="true" automaticFormatSelectionEnabled ="true" />
</behavior>

如果我浏览我的.svc(RESTFul),我最终得到以下错误..

错误

服务'EmployeeRESTfulService'实现多个ServiceContract类型,并且配置文件中没有定义端点。 WebServiceHost可以设置默认端点,但前提是该服务仅实现单个ServiceContract。将服务更改为仅实现单个ServiceContract,或者在配置文件中显式定义服务的端点。

1 个答案:

答案 0 :(得分:1)

  1. 您是否在.svc文件上使用Factory=System.ServiceModel.Activation.WebServiceHostFactory?如果是这样,请删除Factory属性,因为您在config中定义了端点。
  2. WCF中的端点绑定到合同(接口);如果你有两个不同的接口,你需要两个不同的端点。
  3. 在编辑后更新:restful服务Factory使用的Autofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf正在使用WebServiceHost,这要求服务类只实现一个[ServiceContract]界面。你需要Autofac工厂吗?如果没有,只需删除该属性;否则,因为你已经通过配置定义了端点,我想它也应该适用于“普通”工厂(AutofacServiceHostFactory)(我从未使用过Autofac,但你可以试试)。