2

IIS 内から 2 つの WCF サービスを実行しようとしています。1 つは Web サービスで、もう 1 つは Net TCP バインディング サービスです。

これが私のWeb.configのシムルクラムです(サービス名を匿名化しました):

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="ServerService" 
                  binding="netTcpBinding" 
                  bindingConfiguration="" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
            <add baseAddress="htt://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="AACCWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/IMyWebService"/>
          </baseAddresses>
        </host>
      </service>

    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

これを IDE で実行すると、ポート 51953 で実行されているページが開き、http://localhost:51953/WebService.svc?wsdlを参照して Web サービスの WSDL を取得できます(ポートが異なることに注意してください)。ポートを webconfig ファイル (8523) で指定したものに変更しても、WSDL を取得できないようです。

WcfTestClient アプリを "net.tcp://localhost:8523/ServerService" にポイントすると、メタ データにアクセスできないというエラーが表示されます。サービスのエンドポイント)。

ここで何が間違っていますか?

アップデート:

プロジェクト プロパティのポート番号を 8523 に変更しようとしましたが、うまくいかないようでした。また、mex エンドポイントのアドレスを "ServerService\mex" に変更しようとしましたが、テスト クライアントはチャーンに時間を費やしましたが、その後、次のエラーがスローされました。

エラー: net.tcp://localhost:8523/ServerService からメタデータを取得できません これがアクセス権のある Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455 ) を参照してください。WS-Metadata Exchange エラー URI: net.tcp://localhost:8523/ServerService Metadata contains解決できない参照: 「net.tcp://localhost:8523/ServerService」。.Net Framing をサポートしていないサービスへのチャネルを作成しようとしました。HTTP エンドポイントに遭遇している可能性があります。レコード タイプ 'PreambleAck' が予期されていましたが、'72' が見つかりました。

私は掘り続けるつもりですが、助けていただければ幸いです。

更新 2:

mex エンドポイントを mexTcpBinding に変更しました。サービス タグは次のとおりです。

    <endpoint address="ServerServiceWS"
              binding="wsHttpBinding"
              bindingConfiguration=""
              name="WSEndPoint"
              contract="IServerService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8523/"/>
        <add baseAddress="http://localhost:8523/"/>
      </baseAddresses>
    </host>
  </service>

まだ運がありません。テスターに​​正しい URL を入力していることを確認するために、使用している URL は次のとおりです。

net.tcp://localhost:8523/ServerService

私も試しました:

net.tcp://localhost:8523/mex

net.tcp://localhost:8523/

これらすべてにより、次のエラーのバリエーションが得られます。

エラー: net.tcp://localhost:8523/ServerService からメタデータを取得できません これがアクセス権のある Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455 ) を参照してください。WS-Metadata Exchange エラー URI: net.tcp://localhost:8523/ServerService Metadata contains解決できない参照: 「net.tcp://localhost:8523/ServerService」。.Net Framing をサポートしていないサービスへのチャネルを作成しようとしました。HTTP エンドポイントに遭遇している可能性があります。レコード タイプ 'PreambleAck' が予期されていましたが、'72' が見つかりました。

更新 3

FWIW WEB.config にもっと大きな問題があると思います。現在の様子は次のとおりです。

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="" 
                  binding="netTcpBinding" 
                  bindingConfiguration="DefaultBindingConfig" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" 
                  bindingConfiguration="mexBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="MyWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  bindingConfiguration="mexHttpBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/MyWebService"/>
          </baseAddresses>
        </host>
      </service>

    </services>
    <bindings>
      <netTcpBinding>
        <binding name="DefaultBindingConfig"
                 maxConnections="5"
                 portSharingEnabled="true" >
        </binding>
        <binding name="mexBinding"
                 portSharingEnabled="true">
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
      <mexTcpBinding>
        <binding name="mexTcpBinding"/>
      </mexTcpBinding>
      <mexHttpBinding>
        <binding name="mexHttpBinding"/>
      </mexHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServerServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
        <behavior name="MexBehaviour">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Webservice を参照でき、?wsdl を使用して WSDL を取得できますが、アドレスhttp://localhost:8523/MyWebServiceを WCF テスターに​​入れると、エラーもスローされます。

エラー: http://localhost:8523/MyWebServiceからメタデータを取得できません。 アクセス権のある Windows (R) Communication Foundation サービスの場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455 ) を参照してください。WS-Metadata Exchange エラー URI: http://localhost:8523/MyWebService メタデータに参照が含まれています解決できない: 'http://localhost:8523/MyWebService'. http://localhost:8523/MyWebServiceへの HTTP 応答の受信中にエラーが発生しました. これは、サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。これは、HTTP 要求コンテキストがサーバーによって中止されたことが原因である可能性もあります (サービスのシャットダウンが原因である可能性があります)。詳細については、サーバー ログを参照してください。基になる接続が閉じられました: 受信時に予期しないエラーが発生しました。トランスポート接続からデータを読み取ることができません: 既存の接続がリモート ホストによって強制的に閉じられました。既存の接続がリモート ホスト HTTP GET エラー URI によって強制的に閉じられました: http://localhost:8523/MyWebService 'http://localhost:8523/MyWebService' のダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 404: Not Found で失敗しました。

この問題は、パスに関係があるか、テスト アプリケーションに間違った URL を入力しているだけだと思います。それか、まだメタデータを正しく構成していません。

4

3 に答える 3

5

HTTP エンドポイントの場合、IIS Express を使用してホストされている場合、web.config で定義されたエンドポイントをポート 8523 で開始するように、プロジェクト プロパティを再構成する必要があります。自動割り当てポート (51953) の代わりに特定のポート (8523) を使用します。

TCP メタデータの場合、TCP 対応の mex エンドポイント ( ) をサポートする必要がありますmexTcpBinding

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
于 2012-04-25T13:36:43.700 に答える
1

net.tcp および HTTP バインディングは、IIS の異なるポートに設定する必要があります。同じポートまたは別のポートでテストできます。最初のケースでクラッシュします。また、任意のポート番号を使用できます。この場合、TCP ポートを 8524 に変更できます。同じポートで 2 つの別々のプロトコルを使用することはできません。一方、ベース アドレスはセルフホステッド サービスの場合にのみ意味があります。ここで、ベース アドレスは IIS からの URL によって決定されます。

于 2017-01-11T08:58:55.610 に答える
0

これをそのままにして、内部のサービスを変更して構成ファイルの内部に貼り付けるだけで、完全に機能するはずです。net.tcp をテストするには、SvcUtil.exe を使用できます。

       <system.serviceModel>
<services>
  <service name="MyWCFServices.HelloWorldService">
    <endpoint
         binding="netTcpBinding"
         bindingConfiguration="ultra"
         contract="MyWCFServices.IHelloWorldService"/>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"  />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8086/HelloWorldService.svc" />
        <add baseAddress="http://localhost:8081/HelloWorldService.svc" />
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <netTcpBinding>
    <binding name="ultra"
         maxBufferPoolSize="2147483647"
         maxBufferSize="2147483647"
         maxReceivedMessageSize="2147483647"
         portSharingEnabled="false"
         transactionFlow="false"
         listenBacklog="2147483647" >
      <security mode="None">
        <message clientCredentialType="None"/>
        <transport protectionLevel="None" clientCredentialType="None"/>
      </security>
      <reliableSession enabled="false"/>
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
于 2017-07-04T12:21:57.667 に答える