1

同じベース URL で IIS の下で複数の WCF サービスを実行しようとしています (そのため、私のプロジェクトには複数の .svc ファイルがあります)。単一のサービスがある場合はすべて正常に機能しますが、サービスを追加すると問題が発生します。これらの追加サービスのいずれかにアクセスしようとすると、クライアントは契約が「IMerchantService」契約であると考えているようです。たとえば、http://merchants.localtest.me/MerchantProductService.svc?wsdl (ローカルでホストされているサービスのアドレス) を参照すると返されるサービス定義は IMerchantService であり、IMerchantProductService ではありません。さらに、http://merchants.localtest.me/MerchantProductService.svcを参照すると、タイトルは「MerchantService」であり、予想どおり「MerchantProductService」ではありません。

私のサービス構成は次のとおりです。

  <services>
  <service name="MyCompany.Services.Merchants.MerchantProductService">
    <endpoint address="" behaviorConfiguration="Proto.Common.EndpointBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" contract="MyCompany.Api.Merchants.Services.IMerchantProductService"/>
    <endpoint address="mexMerchantProductService"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
  </service>
  <service name="MyCompany.Services.Merchants.MerchantService">
    <endpoint address="" behaviorConfiguration="Proto.Common.EndpointBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" contract="MyCompany.Api.Merchants.Services.IMerchantService"/>
    <endpoint address="mexMerchantService"
          binding="mexHttpBinding"
          contract="IMetadataExchange"  />
  </service>
  <service name="MyCompany.Services.Merchants.Workflows.NewMerchantWorkflow">
    <endpoint address="" behaviorConfiguration="Proto.Common.EndpointBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" contract="MyCompany.Api.Merchants.Services.INewMerchantServiceWorkflow"/>
    <endpoint address="mexNewMerchantWorkflow"
  binding="mexHttpBinding"
  contract="IMetadataExchange" />
  </service>
  <service name="MyCompany.Services.Merchants.MerchantFreightService">
    <endpoint address="" behaviorConfiguration="Proto.Common.EndpointBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" contract="MyCompany.Api.Merchants.Services.IMerchantFreightService"/>
    <endpoint address="mexMerchantFreightService"
  binding="mexHttpBinding"
  contract="IMetadataExchange" />
  </service>
  <service name="MyCompany.Services.Merchants.MerchantAuctionService">
    <endpoint address="" behaviorConfiguration="Proto.Common.EndpointBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" contract="MyCompany.Api.Pricing.Services.IMerchantAuctionService"/>
    <endpoint address="mexMerchantAuctionService"
  binding="mexHttpBinding"
  contract="IMetadataExchange" />
  </service>
</services>

追加の mex エンドポイントを削除しようとしましたが、違いはありません。また、契約書を確認しましたが、問題ないようです。IMerchantProductService コントラクトは次のとおりです。

[ServiceContract(Namespace = "http://www.MyCompany.com/services/", Name = "MerchantProductService")]
[ContractClass(typeof(MerchantProductServiceContracts))]
public interface IMerchantProductService
{
    /// <summary>
    /// Searchs the merchants product catalog using product name, merchant sku or product global id
    /// </summary>
    /// <param name="searchTerm"></param>
    /// <returns></returns>
    [OperationContract]
    List<MerchantProductQuickSearchItem> QuickSearchMerchantProducts(int merchantId, string searchTerm);

    /// <summary>
    /// Gets a merchant product based on the Id
    /// </summary>
    /// <param name="ourMerchantProductId">The id of the product to get</param>
    /// <returns></returns>
    [OperationContract]
    MerchantProduct GetMerchantProduct(int ourMerchantProductId, int merchantId);

    ///etc.

}

IMerchantService コントラクトは次のとおりです。

[ServiceContract(Namespace = "http://www.MyCompany.com/services/", Name = "MerchantService")]
[ContractClass(typeof(MerchantServiceContracts))]
public interface IMerchantService
{
    /// <summary>
    /// Gets a merchant instance
    /// </summary>
    /// <param name="merchantId"></param>
    /// <returns></returns>
    [OperationContract]
    Merchant GetMerchant(int merchantId);

    /// <summary>
    /// Gets a merchant's bid settings
    /// </summary>
    /// <param name="merchantId"></param>
    /// <returns></returns>
    [OperationContract]
    MerchantBidSettings GetMerchantBidSettings(int merchantId);

    //etc.
}

私がこれまでに試したこと:

  1. すべてを basicHttpBinding に変更します。違いはありませんでした。
  2. Protobuf の動作設定を削除しました。違いはありませんでした。
  3. 個々の mex エンドポイントを削除します。違いはありませんでした
  4. さまざまなクライアント (WCFStorm、WCF テスト クライアント) を試しましたが、すべてが間違ったコントラクトを報告しました
  5. 個々の svc ファイルが期待されるコントラクトを実装していることを確認しました (実装されています)。

私の質問は、1)これは可能ですか(つまり、IIS ホスティングの複数の .svc ファイル)、可能であれば 2)問題を引き起こしている可能性のある構成に何か問題があるのでしょうか。

4

1 に答える 1

4

各 .svc ファイルの内容を確認します。正しいサービス実装を参照していますか? 配管するには、web.config + .svc ファイル + c# コントラクト定義 + c# サービス実装が必要です。

<%@ ServiceHost 
    Language="C#"
    Debug="true"
    Service="MyCompany.Services.Merchants.MerchantService" %>
于 2013-01-08T18:09:28.907 に答える