it-swarm.com.de

WCF-Metadaten enthalten eine Referenz, die nicht aufgelöst werden kann

Ich habe ein paar Stunden damit verbracht, nach diesem Fehler zu suchen, und ich habe fast alles auf Google getestet.

Ich möchte auf einen Dienst über TCP, .NET4 und VS2010 in C # zugreifen.

Ich habe einen sehr kleinen Service:


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);
        }

    }
}

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

Und diesen Code, um es zu hosten:


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();
    }
}

Nun möchte ich den Mandanten anlegen, aber mir ist es nicht möglich. Ich habe Add Service Reference und svcutil direkt verwendet, erhalte jedoch die Fehlermeldung:


C:\Programme (x86)\Microsoft Visual Studio 10.0\VC> svcutil.exe net.tcp: // loc alhost: 5050/Service1 Microsoft (R) Servicemodell Metadaten-Tool [Microsoft® Windows®® Communication Foundation, Version 4.0.30319.1] Copyright (c) Microsoft Corporation. Alle Rechte reserviert.

Versuch, Metadaten von .__ herunterzuladen. 'net.tcp: // localhost: 5050/Service1' mithilfe von W S-Metadata Exchange. Diese URL unterstützt DISCO nicht. Metadaten-Tool für Microsoft (R) -Service-Modelle [Microsoft® Windows®® Communication Foundation, Version 4.0.30319.1] Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.

Fehler: Metadaten können nicht von net.tcp: // localhost: 5050/Service1 abgerufen werden

Wenn dies ein Windows (R) Communication Foundation-Dienst ist, an den Sie Wenn Sie über acce ss verfügen, überprüfen Sie bitte, ob Sie die Metadatenveröffentlichung aktiviert haben an der angegebenen Adresse Hilfe zur Aktivierung der Metadatenveröffentlichung Bitte beachten Sie die MSDN-Dokumentation unter http://go.Microsoft.com/fwlink/?LinkId=65455 .

WS-Metadaten-Austauschfehler URI: net.tcp: // localhost: 5050/Service1

Metadaten enthalten eine Referenz, die nicht aufgelöst werden kann: 'net.tcp: // localhost: 5050/Service1'.

Die Socket-Verbindung wurde abgebrochen. Dies kann durch einen Fehler bei der Verarbeitung Ihrer Nachricht oder ein Überschreiten des Empfangszeitlimits durch .__ verursacht werden. der Remote-Host oder ein Problem mit der Netzwerkressource. Lokal Socket-Timeout war '00: 04: 59.9863281 '.

Es ist das beste Interaktionssystem der Welt, in dem der Host entfernt ist

Wenn Sie weitere Hilfe wünschen, geben Sie "svcutil /?" Ein.


So kann ich den Dienst ohne Probleme hosten, aber ich kann die Proxys nicht erstellen.

Ich habe fast jede Konfig versucht, die ich gefunden habe, aber ich denke, dass die aktuelle web.config korrekt ist. Es gibt das Verhalten, die Sicherheit und die Bindungen mit mex, die von den Endpunkten verwendet werden.

Ich habe versucht, eine app.config zu erstellen und sie mit svcutil.exe auf denselben Ordner zu setzen.

11
JoanComasFdz

Ihnen fehlt die Servicekonfiguration

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

Mit dieser Konfiguration sollten Sie die Basisadresse nicht im Code definieren müssen.

8
Ladislav Mrnka

Beim Versuch, eine vorhandene Servicereferenz zu aktualisieren, habe ich dieselbe Fehlermeldung erhalten. Es stellte sich heraus, dass ich Datenverträge mit demselben Namen im selben Namensraum hatte. Weitere Untersuchungen ergaben den tatsächlichen Fehler:

DataContract für Typ [redacted] kann nicht zu DataContractSet hinzugefügt werden, da der Typ ' [redacted] ' mit demselben Datenvertragsnamen 'DocumentInfo' im Namespace ' [redacted] ' bereits vorhanden ist Die Verträge sind nicht gleichwertig.

Ich habe den DataContract geändert, um einen Namen für eine der Klassen anzugeben. 

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

Ich poste dies hier, falls es jemandem mit dem gleichen Problem helfen könnte.

3
mslissap

Ich erhielt dieselbe Fehlermeldung und wie sich herausstellte, war das Problem auf Text in einem Kommentarblock zurückzuführen 

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

Nachdem Sie solche Zeichen aus dem kommentierten Block entfernt haben, funktioniert alles einwandfrei

2

Vielleicht wird es für jemanden hilfreich sein.

Mein Problem lag in einem Vertragsargument und ich entdeckte es mit Hilfe von Event Viewer:

Die Operation [Name der Methode] hat entweder einen Parameter oder einen Rückgabetyp, der mit MessageContractAttribute zugeordnet wird. Um die Anforderungsnachricht mit einem Nachrichtenvertrag darstellen zu können, muss der Vorgang einen single parameter mit MessageContractAttribute zugeordnet haben. Um die Antwortnachricht mit einem Nachrichtenvertrag darzustellen, muss der Rückgabewert der Operation ein Typ sein, der mit MessageContractAttribute zugeordnet wird, und die Operation hat möglicherweise keine out- oder ref-Parameter.

Wenn Sie also mehr als ein Argument angehängt haben und bereits über das Argument [MessageContract] verfügen, wird der betreffende Fehler angezeigt. Ganz offensichtlich nicht.

1
rock_walker

Ich hatte das gleiche Problem (wenn der Client den Dienst nicht im Menü "Dienstreferenz hinzufügen" "sah"), während nur die TCP-Bindung verwendet wurde. Nach dem Versuch, Verhalten hinzuzufügen, musste mein Dienst mit einer Ausnahme enden, da er nicht die richtige Adresse gefunden hat. Ich weiß nicht, ob es die beste Idee ist, aber Sie können die zweite Basisadresse als http hinzufügen .... hier ist meine Konfiguration und mein Code, es funktioniert.

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

Und der Code 

  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();

Die http-Adresse wird jetzt vom Client zum Hinzufügen von Servicereferenzen verwendet, und die auf Client-Seite automatisch generierte Konfiguration verwendet das net.tcp-Protokoll zum Aufrufen der Funktion. 

1
Anna

Für das obige Problem überprüfen Sie die Datei reference.svc, die zu dem Zeitpunkt generiert wird, zu dem Sie die Referenz hinzufügen. Die darin erwähnte URL wird zum Aktualisieren des Dienstes verwendet, sodass Sie überprüfen können, ob der Dienst ausgeführt wird oder nicht.

0
srbh