2011-01-11 10 views
10

Ich habe einige Stunden damit verbracht, nach diesem Fehler zu suchen, und ich habe fast alles auf Google getestet.WCF-Metadaten enthalten eine Referenz, die nicht aufgelöst werden kann

Ich möchte auf einen Dienst mit 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 diesem 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 thi s-Code 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(); 
    } 
} 

Jetzt möchte ich den Client erstellen, aber ich es nicht posible. Ich habe Add Service Reference verwendet und SvcUtil direkt, aber ich erhalte diesen Fehler:


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, Version 4.0.30319.1] Copyright (c) Microsoft Corporation. All rights reserved.

Attempting to download metadata from 'net.tcp://localhost:5050/Service1' using W S-Metadata Exchange. This URL does not support DISCO. Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1] Copyright (c) Microsoft Corporation. All rights reserved.

Error: Cannot obtain Metadata from net.tcp://localhost:5050/Service1

If this is a Windows (R) Communication Foundation service to which you have acce ss, please check that you have enabled metadata publishing at the specified addr ess. For help enabling metadata publishing, please refer to the MSDN documentat ion at http://go.microsoft.com/fwlink/?LinkId=65455 .

WS-Metadata Exchange Error URI: net.tcp://localhost:5050/Service1

Metadata contains a reference that cannot be resolved: 'net.tcp://localhost: 5050/Service1'.

The socket connection was aborted. This could be caused by an error processi ng your message or a receive timeout being exceeded by the remote host, or an un derlying network resource issue. Local socket timeout was '00:04:59.9863281'.

Se ha forzado la interrupción de una conexión existente por el host remoto

If you would like more help, type "svcutil /?"


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

Ich habe fast jede Konfiguration ausprobiert, die ich gefunden habe, aber ich denke, dass die aktuelle web.config korrekt ist. Es gibt die Verhaltensweisen, die Sicherheit und die Bindungen, die von den Endpunkten verwendet werden.

Ich habe versucht, eine app.config zu erstellen und es in den gleichen Ordner mit svcutil.exe.

+0

@JohnSaunders, kann ich nicht verstehen, warum jemand mit Ihrem Ruf den Antwortcode in den Fragecode kopieren würde und dadurch diese ganze Frage völlig ungültig machen würde. Ich verschwendete nur Zeit damit, den Unterschied zwischen dem Fragecode und dem Antwortcode herauszufinden, bevor ich merkte, dass jemand getan hat, was du getan hast ... wo ist der Vorteil dabei? Niemand konnte wissen, was die eigentliche Frage war. – Sheridan

+0

@Sheridan: Hier ist ein großer Lebenshinweis: Wann immer Sie Dinge wie sagen, "Ich kann nicht verstehen, wie", oder "Ich kann nicht sehen wie", denken Sie, dass es ein Problem Ihres Verständnisses oder Ihrer Vision sein könnte . Du kannst "nicht verstehen wie", weil ich das nicht getan habe. Ich habe nur den Code eingerückt. Sehen Sie sich den Bearbeitungsverlauf genauer an. Ich habe es gerade getan. –

+1

Ich * habe * einen Blick * vor * meinem Kommentar geworfen und während ich deinen Kommentar akzeptiere, möchte ich sagen, dass er immer noch * erscheint *, als ob du diesen Code hinzugefügt hättest ... ahhh ... das ist nur in der * Nebeneinander * Ansicht. In den anderen Ansichten kann ich das wahre Bild sehen. Entschuldigung ... Ich hätte genauer hinsehen sollen, bevor ich kommentiert habe. – Sheridan

Antwort

8

Sie vermissen 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 nicht Basisadresse in Code definieren müssen.

+0

Danke für die Antwort. Ich habe die app.config nicht richtig auf dem Konsolenprojekt meines Servers eingestellt. Ich habe die Bindungen und Verhaltensweisen im Code vor dem Host deklariert. Open(); und es hat funktioniert. – JoanComasFdz

+0

Vergessen Sie nicht, als Antwort zu markieren, wenn dies Ihr Problem gelöst hat bitte – Shenaniganz

1

Ich hatte das gleiche Problem (wenn Client nicht "sah" den Dienst in "Dienst hinzufügen" -Menü), während nur TCP-Bindung verwenden. Nach dem Versuch, Verhalten hinzuzufügen, musste ich meinen Dienst mit Ausnahme beenden, weil die richtige Adresse nicht gefunden wurde. Ich weiß nicht, ob es die beste Idee ist, aber Sie können zweite Basisadresse als http hinzufügen .... hier ist meine Konfiguration und 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 jetzt von Client USEND wird Dienstverweis hinzufügen und automatisch generierte Config auf Client-Seite verwendet net.tcp Protokoll das nennen Funktion.

+0

Das scheint eine nette Lösung, und es scheint Logik, aber sobald Ihr Client generiert wurde, benötigen Sie die http-Adresse? – JoanComasFdz

+1

Die HTTP-Adresse wird nicht benötigt, wenn Sie einen Client haben. Wenn Sie jedoch in Zukunft einige Clients generieren müssen, ist es besser, sie in der Konfiguration zu haben. – Anna

2

ich die gleiche Fehlermeldung erhalten und wie sich herausstellte, war das Problem innerhalb von ein Kommentare

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

Nach dem Entfernen solcher Zeichen aus dem kommentierten Block in Text, funktioniert alles einwandfrei

3

Ich habe den gleichen Fehler beim Versuch erhalten, eine vorhandene Service-Referenz zu aktualisieren. Es stellte sich heraus, dass ich Datenverträge mit demselben Namen innerhalb desselben Namensraums hatte. Eine weitere Untersuchung ergab den tatsächlichen Fehler:

DataContract for type [redacted] cannot be added to DataContractSet since type '[redacted]' with the same data contract name 'DocumentInfo' in namespace '[redacted]' is already present and the contracts are not equivalent.

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 für den Fall, dass es jemand mit dem gleichen Problem helfen könnte.

+0

Ich bin mir ziemlich sicher, dass dies mein Problem ist, weil ich mehrere Datenverträge geändert habe. Ich frage mich, was Sie getan haben, um die erwähnte Nachricht zu bekommen, Die Nachricht würde helfen, herauszufinden, welcher DataContract bereits existiert –

+0

@HaraldCoppoolse Ich habe versucht, den Dienst in einem Browser anzuzeigen, und ein detaillierterer Fehler erschien dort. Ich benutze VS 2015, navigierte zum Dienst, klickte mit der rechten Maustaste darauf und wählte Ansicht im Browser. Ich hoffe das hilft dir! – mslissap

1

Vielleicht wird es für jemanden hilfreich sein.

Mein Problem war in einem Vertrag Argumente, und ich entdecken es mit Hilfe von Ereignisanzeige:

The operation [Name of method] either has a parameter or a return type that is attributed with MessageContractAttribute. In order to represent the request message using a Message Contract, the operation must have a single parameter attributed with MessageContractAttribute. In order to represent the response message using a Message Contract, the operation's return value must be a type that is attributed with MessageContractAttribute and the operation may not have any out or ref parameters.

Also, wenn Sie mehr als ein Argument angehängt, bereits mit [Message] Argumente, dann sind Sie sehe Fehler in Frage. Völlig nicht offensichtlich.

Verwandte Themen