1. ホーム
  2. wcf

[解決済み] WCFメタデータに解決できない参照が含まれている

2022-02-27 14:34:27

質問内容

このエラーについて数時間かけて検索し、Googleにあるものはほとんどすべてテストしました。

C#で、.NET4とVS2010を使用して、TCPを使用してサービスにアクセスしたいのですが、どうすればいいですか?

私は非常に小さなサービスを持っています。


namespace WcfService_using_callbacks_via_tcp
{
    [ServiceContract(CallbackContract = typeof(ICallback), SessionMode = SessionMode.Required)]
    public interface IService1
    {
        [OperationContract]
        string Test(int value);
    }

    public interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void ServerToClient(string sms);
    }
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Service1 : IService1
    {
        public string Test(int value)
        {
            ICallback the_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            the_callback.ServerToClient("Callback from server, waiting 1s to return value.");
            Thread.Sleep(1000);
            return string.Format("You entered: {0}", value);
        }

    }
}


このWeb.configで。


<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfService_using_callbacks_via_tcp.Service1" behaviorConfiguration="Behaviour_Service1">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:5050/Service1" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" contract="WcfService_using_callbacks_via_tcp.IService1"/>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="mexTcp" contract="IMetadataExchange"/>
      </service>
    </services>

    <bindings>
      <!--
        TCP Binding
      -->
      <netTcpBinding>
        <binding name="DuplexNetTcpBinding_IService1" sendTimeout="00:00:01"
                 portSharingEnabled="true">

        </binding>

        <binding name="mexTcp" portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>


    </bindings>

    <behaviors>
      <serviceBehaviors>
        <!--
          Behaviour to avoid a rush of clients and to expose metadata over tcp
        -->
        <behavior name="Behaviour_Service1">
          <serviceThrottling maxConcurrentSessions="10000"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>

        <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>


そして、それをホストするためのこのコード。


static void Main(string[] args)
{
    Uri base_address = new Uri("net.tcp://localhost:5050/Service1");
    ServiceHost host = null;
    try
    {
        // Create the server
        host = new ServiceHost(typeof(Service1), base_address);
        // Start the server
        host.Open();
        // Notify it
        Console.WriteLine("The service is ready at {0}", base_address);
        // Allow close the server
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
        // Close it
        host.Close();
    }
    catch (Exception ex)
    {
        // Opus an error occurred
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(string.Format("Host error:\r\n{0}:\r\n{1}", ex.GetType(), ex.Message));
        Console.ReadLine();
    }finally
    {
        // Correct memory clean
        if(host != null)
            ((IDisposable)host).Dispose();
    }
}


現在、クライアントを作成したいのですが、作成することができません。サービスリファレンスの追加とsvcutilを直接使用しましたが、このエラーが表示されます。


<ブロッククオート

C:♪Program Files (x86)♪Microsoft Visual Studio 10.0VC♪>svcutil.exe net.tcp://loc alhost:5050/Service1 Microsoft (R) サービスモデル メタデータツール [Microsoft (R) Windows (R) Communication Foundation, バージョン4.0.30319.1]. Copyright (c) Microsoft Corporation. 著作権について を予約しました。

からのメタデータのダウンロードを試みている。 'net.tcp://localhost:5050/Service1' で W S-Metadata Exchange を使用しています。この URL は DISCO をサポートしていません。マイクロソフト(R)サービスモデルメタデータツール [マイクロソフト(R)Windows(R)コミュニケーション ファンデーション バージョン 4.0.30319.1] Copyright (c) Microsoft Corporation. All rights reserved.

エラーです。net.tcp://localhost:5050/Service1 からメタデータを取得できません。

このサービスが Windows (R) Communication Foundation のサービスである場合 メタデータの公開が有効になっていることを確認してください。 を指定します。 メタデータ・パブリッシングを有効にする方法については、こちらを参照してください。 にあるMSDNドキュメントを参照してください。 http://go.microsoft.com/fwlink/?LinkId=65455 .

WS-Metadata交換エラー URI: net.tcp://localhost:5050/Service1

メタデータに解決できない参照が含まれています: 'net.tcp://localhost: 5050/Service1'.

ソケット接続が中断されました。これは、メッセージの処理にエラーが発生したか、受信タイムアウトを超えたことが原因である可能性があります。 リモートホスト、またはネットワークリソースに問題がある可能性があります。ローカル ソケットタイムアウトは「00:04:59.9863281」でした。

リモートホストに存在する接続を強制的に中断させた

さらにヘルプが必要な場合は、"svcutil /?"と入力してください。


そのため、サービスを問題なくホストすることはできますが、プロキシを作成することはできません。

ほぼ全ての設定を試しましたが、現在のweb.configが正しいようです。動作、セキュリティ、そしてエンドポイントによって使用されるmexを使用したバインディングがあります。

app.configを作成し、svcutil.exeと同じフォルダに設定してみました。

どうすればいいですか?

サービス設定が不足しています

<system.serviceModel>
  <services>
    <service name="WcfService_using_callbacks_via_tcp.Service1" 
      behaviorConfiguration="Behavior_Service1">
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:5050/Service1" />
        </baseAddresses>
      </host>
      <endpoint address="" contract="WcfService_using_callbacks_via_tcp.IService1"
         binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" />
      <endpoint address="mex" contract="IMetadataExchange" binding="mexTcpBindng" />
    </service>
  </services>
  ...
</system.serviceModel>

この設定により、コード内でベースアドレスを定義する必要がなくなります。