3

そこで、いくつかの懸念から、当初は単一のインターフェース契約であったものを2つの別個の契約に分割しました。現在、両方のインターフェイスを実装するクラス(部分的)は1つだけであり、それらすべてをWCFを介してRESTサービスとして利用できるようにしたいと考えています。契約内容は以下のとおりです。

WCFサービスホストにAutofacを使用しています。

以下は私の.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)を参照すると、以下のエラーが発生します。

エラー

サービス'EmployeeRESTfulService'は複数のServiceContractタイプを実装し、構成ファイルにエンドポイントは定義されていません。WebServiceHostはデフォルトのエンドポイントを設定できますが、サービスが単一のServiceContractのみを実装している場合に限ります。単一のServiceContractのみを実装するようにサービスを変更するか、構成ファイルでサービスのエンドポイントを明示的に定義します。

4

1 に答える 1

1
  1. Factory=System.ServiceModel.Activation.WebServiceHostFactory.svcファイルでを使用していますか?その場合は、構成でエンドポイントを定義しているため、Factory属性を削除します。
  2. WCFのエンドポイントは、コントラクト(インターフェイス)にバインドされています。2つの異なるインターフェースがある場合は、2つの異なるエンドポイントが必要になります。

編集後の更新FactoryRESTfulサービスで使用されるはAutofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf、を使用しています。これには、サービスクラスが1つのインターフェイスWebServiceHostのみを実装する必要があります。[ServiceContract]Autofacファクトリーが必要ですか?そうでない場合は、その属性を削除してください。それ以外の場合は、configを使用してエンドポイントをすでに定義しているので、「通常の」ファクトリ(AutofacServiceHostFactory)でも機能するはずです(Autofacを使用したことはありませんが、試すことができます)。

于 2012-09-26T19:19:16.047 に答える