8

異なる URL で異なる機能を参照する 2 つのエンドポイントを公開するように構成しようとしている WCF サービスがあります。

必要なのはService1で、メソッド A、B、C、およびService2を公開し、メソッド D、E を公開します。localhost /WebServiceName/Service1/Service.svclocalhost/WebServiceName/Service2/Serviceの両方を参照できるようにしたい.svc .

localhost/WebServiceName/Service1/Service.svcを参照する他のアプリケーションは、メソッド A、B、および C を含むインターフェイスのみを参照する必要があります。Service2インターフェイスに関するものは何も表示されません。Service2 についても同様です。

ここまでで、WCF サービスにI_Service1I_Service2の 2 つのインターフェイスを定義しました。

次のように、web.config に 2 つのエンドポイントを追加しました。

<endpoint address="http://localhost/WebServiceName/Service1/" binding="wsHttpBinding" contract="WebServiceName.I_Service1" bindingConfiguration="Binding1" />
<endpoint address="http://localhost/WebServiceName/Service2/" binding="wsHttpBinding" contract="WebServiceName.I_Service2" bindingConfiguration="Binding2" />  

エンドポイントで完全なアドレスを使用するという提案は、ここから来ています: IIS の下の複数のエンドポイント

それでも、 localhost/WebServiceName/Service1/Service.svcを参照できません。私は受け取ります:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

localhost/WebServiceName/Service.svcを正常に参照でき、wsdl にはメソッド A、B、C、D、E が含まれています。しかし、これは私が望む動作では間違っているはずです。

見逃したものはありますか?

更新: この記事http://allen-conway-dotnet.blogspot.ro/2011/09/exposed-multiple-binding-types-for.htmlに従って、これらのエンドポイント用に 2 つの異なるコントラクト サービスを作成しました。しかし、現在、参照するとService1しか表示されません。Service2は明らかに存在しません (HTTP 404 エラー関連の問題が表示されます)。

構成は次のようになります。

<services>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1/Service.svc" />
       </baseAddresses>
     </host>
   </service>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service2" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service2/Service.svc" />
       </baseAddresses>
     </host>
   </service>
  </services>
4

3 に答える 3

4

私がいつもこれを行ってきた方法は次のとおりです。サービスに単一の「ベースアドレス」を設定し、そのベースアドレスに追加する別のテキストとしてエンドポイントアドレスを指定します。

 <service name="MyNamespace.MyService">
    <endpoint address="FirstEndpointAddress" binding="netTcpBinding"
      name="FirstEndpointName"
      contract="MyNamespace.FirstEndpointContract" />
    <endpoint address="SecondEndpointAddress" binding="netTcpBinding"
      name="SecondEndpointName"
      contract="MyNamespace.SecondEndpointContract" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8733/MyBaseAddress" />
      </baseAddresses>
    </host>
  </service>

したがって、あなたの場合、ベースアドレスはでlocalhost/WebServiceNameあり、エンドポイント1のエンドポイントアドレスはである可能性がありますService1/Service.svc。同様に、エンドポイント2の場合はService2/Service.svc。エンドポイントアドレスに完全なアドレスを入れるためのアドバイスに従っていることがわかりますが、私が言えるのは、この方法で成功したということだけです。

于 2012-12-10T13:42:59.587 に答える
3

今のところ、この問題に対する私の解決策は、Web サービスに 2 つの .svc ファイルを組み込んで、2 つのインターフェイスを分離することでした。そのような、私はlocalhost/WebServiceName/Service1.svclocalhost/WebServiceName/Service2.svcを持っています。

エンドポイント構成で

<services>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1.svc" />
       </baseAddresses>
     </host>
   </service>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding2"
     contract="WebServiceName.I_Service2" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1.svc" />
       </baseAddresses>
     </host>
   </service>
  </services>

このソリューションは必ずしも最適なものではありません (クライアントが本当に望む場合、このサービスが 2 つの異なるインターフェイスを公開していることがわかりますが、異なる資格情報/トークンでそれらを保護できます)。しかし、現時点では私はそれで行きます。

于 2012-12-21T14:22:00.483 に答える
1

あなたが説明したものを作ってみました。これはすべて成功します。いくつかの手順が明らかであっても、怒らないでください。そう:

  1. WCF サービス アプリケーション プロジェクトを作成します。
  2. 2 つの WCF サービス アイテムを追加します (既定では、create インターフェイスと svc ファイルになります)。
  3. Web アプリケーション プロジェクトを作成します。
  4. [検出] ボタンを使用して、2 つのサービス参照を追加します (Web アプリ プロジェクトを右クリック ==> [サービス参照を追加])。
  5. それで全部です。

デフォルトでは、Web アプリケーション プロジェクトで次の Web.config を取得しました。

     <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="BasicHttpBinding_IService2" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:3597/Service1.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
    name="BasicHttpBinding_IService1" />
  <endpoint address="http://localhost:3597/Service2.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2"
    name="BasicHttpBinding_IService2" />
</client>

WCF プロジェクトの再構築と WebReference の更新を試みることができます。

于 2012-12-06T11:17:24.247 に答える