web-dev-qa-db-ja.com

WCFメタデータに解決できない参照が含まれています

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

C#でTCP、.NET4、VS2010を使用してサービスにアクセスしたい

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


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.0\VC> svcutil.exe net.tcp:// loc alhost:5050/Service1 Microsoft(R)Service Model Metadata Tool [Microsoft(R)Windows(R)Communication Foundation 、バージョン4.0.30319.1] Copyright(c)Microsoft Corporation。全著作権所有。

W S-Metadata Exchangeを使用して「net.tcp:// localhost:5050/Service1」からメタデータをダウンロードしようとしています。このURLはDISCOをサポートしていません。 Microsoft(R)Service Model Metadata Tool [Microsoft(R)Windows(R)Communication Foundation、Version 4.0.30319.1] Copyright(c)Microsoft Corporation。全著作権所有。

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

これがアクセスするWindows(R)Communication Foundationサービスである場合は、指定されたアドレスでメタデータの発行が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDNのドキュメント http://go.Microsoft.com/fwlink/?LinkId=65455 を参照してください。

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

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

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

Se ha forzado lainterrupciónde unaconexiónexistente por el Host remoto

さらにヘルプが必要な場合は、「svcutil /?」と入力します。


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

私は見つけたほとんどすべての設定を試しましたが、現在のweb.configは正しいと思います。エンドポイントによって使用される動作、セキュリティ、およびmexを使用したバインディングがあります。

App.configを作成し、svcutil.exeと同じフォルダーに設定しようとしました。

11
JoanComasFdz

サービス構成がありません

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

この構成では、コードでベースアドレスを定義する必要はありません。

8
Ladislav Mrnka

既存のサービス参照を更新しようとしたときに同じエラーを受け取りました。同じ名前空間内に同じ名前のデータコントラクトがあることがわかりました。さらなる調査により、実際のエラーが発生しました。

タイプ[編集済み]のDataContractは、同じデータコントラクト名 'DocumentInfoを持つタイプ'[編集済み] 'なので、DataContractSetに追加できません。 '名前空間の'[編集済み] 'はすでに存在しており、コントラクトは同等ではありません。

DataContractを変更して、クラスの1つに名前を付けました。

[DataContract(Namespace = "urn:*[redacted]*:DataContracts", Name = "SC_DocumentInfo")]

同じ問題が発生する可能性があるため、こちらに投稿します。

3
mslissap

同じエラーメッセージが表示されましたが、問題が発生したのはコメントブロック内のテキストが原因でした

<!-- comments included characters like à, ç and ã -->

コメント付きブロックからそのような文字を削除した後、すべてが正常に動作します

2

多分それは誰かのために役立つでしょう。

私の問題は契約の議論にあり、Event Viewerの助けを借りてそれを発見しました:

操作[Name of method]には、パラメーターまたはMessageContractAttributeに起因する戻り値の型があります。メッセージコントラクトを使用して要求メッセージを表すには、操作に単一パラメーターがMessageContractAttributeで属性付けされている必要があります。メッセージコントラクトを使用して応答メッセージを表すには、操作の戻り値がMessageContractAttributeで属性付けされた型である必要があり、操作にoutまたはrefパラメーターがない場合があります。

そのため、[MessageContract]引数をすでに持っている複数の引数を追加した場合、問題のエラーが表示されます。完全に明白ではありません。

1
rock_walker

Tcpバインディングのみを使用しているときに(クライアントが[サービス参照の追加]メニューでサービスを「表示しない」場合)同じ問題が発生しました。 Behaviorを追加しようとした後、適切なアドレスが見つからなかったため、サービスを例外で終了させました。それが最善のアイデアかどうかはわかりませんが、2番目のベースアドレスをhttpとして追加できます。ここに私の設定とコードがあります。

    <?xml version="1.0" encoding="utf-8" ?><configuration>  <system.serviceModel>  <services>
  <service name="TestBindings.StockQuoteService">
    <Host>
      <baseAddresses>
        <add baseAddress="net.tcp://10.62.60.62:34000/StockQuoteService" />
        <add baseAddress ="http://10.62.60.62:12000/StockQuoteService"/>
      </baseAddresses>
    </Host>
    <endpoint address=""
    contract="TestBindings.IStockQuoteService"
    binding="netTcpBinding" />
  </service>
</services>

そしてコード

  class Program
{
    static void Main(string[] args)
    {
        ServiceHost sh = new ServiceHost(typeof(StockQuoteService));
        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
        behavior.HttpGetEnabled = true;
        sh.Description.Behaviors.Add(behavior);
        sh.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),
            "mex");
        sh.Open();

クライアントはhttpアドレスを使用してサービス参照を追加し、クライアント側で自動的に生成された構成はnet.tcpプロトコルを使用して関数を呼び出します。

1
Anna

上記の問題については、参照を追加するときに生成されるreference.svcファイルを確認してください。に記載されているURLは、サービスの更新に使用されるため、サービスが実行されているかどうかを確認できます。

0
srbh