3

因此,出于一些顾虑,我将最初的单一接口契约拆分为两个独立的契约。现在,我只有一个类(部分)实现了这两个接口,我想通过 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时,我可以看到命令和查询服务操作。

我正在尝试 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) 我最终会出现以下错误..

错误

Service 'EmployeeRESTfulService' 实现了多种 ServiceContract 类型,并且在配置文件中没有定义端点。WebServiceHost 可以设置默认端点,但前提是服务仅实现单个 ServiceContract。要么将服务更改为仅实现单个 ServiceContract,要么在配置文件中明确定义服务的端点。

4

1 回答 1

1
  1. Factory=System.ServiceModel.Activation.WebServiceHostFactory在 .svc 文件上使用吗?如果是这样,请删除 Factory 属性,因为您在 config.xml 中定义端点。
  2. WCF 中的一个端点绑定到一个合约(接口);如果您有两个不同的接口,则需要两个不同的端点。

更新以下编辑Factoryrestful 服务Autofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf使用的 , 正在使用WebServiceHost,这要求服务类只实现一个[ServiceContract]接口。您需要 Autofac 工厂吗?如果没有,只需删除该属性;否则,由于您已经通过配置定义了端点,我想它也应该与“普通”工厂(AutofacServiceHostFactory)一起使用(我从未使用过 Autofac,但您可以尝试)。

于 2012-09-26T19:19:16.047 回答