2012-07-16 10 views
8

Jestem początkującym użytkownikiem WCF i studiuję w Essential WCF.WCF InvalidOperationException: Wiążąca instancja została już powiązana z odsłuchowym identyfikatorem URI

Wystąpił problem podczas korzystania z ServiceContract NameSpace i Name. Po uruchomieniu kodu przechwytywany jest wyjątek InvalidOperationException. Ale nie mogłem jasno zrozumieć.

Instancja wiążąca została już powiązana z odsłuchowym identyfikatorem URI "http: // localhost: 8080/NamespaceChange01". Jeśli dwa punkty końcowe chcą współużytkować tę samą metodę ListenUri, muszą również współużytkować tę samą instancję obiektu wiążącego. Dwa będące w konflikcie punkty końcowe zostały określone w wywołaniach AddServiceEndpoint(), w pliku konfiguracyjnym lub w połączeniu z AddServiceEndpoint() i config.

Czy ktoś wie, jak udostępnić wyjątek InvalidOperationException?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 

namespace NamespaceChange01 
{ 

    [ServiceContract(Name = "MyServiceName", Namespace = "http://ServiceNamespace")] 
    public interface IBurgerMaster 
    { 
     [return: MessageParameter(Name = "myOutput")] 
     [OperationContract(Name = "OperationName", Action = "OperationAction", ReplyAction = "ReplyActionName")] 
     double GetStockPrice(string ticker); 
    } 

    [ServiceBehavior(Namespace = "http://MyService")] 
    public class BurgerMaster : IBurgerMaster 
    { 

     public double GetStockPrice(string ticker) 
     { 
      return 100.99; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      ServiceHost host = new ServiceHost(typeof(BurgerMaster)); 
      host.Open(); 
      Console.ReadLine(); 
      host.Close(); 
     } 
    } 
} 
  • app.config

    <?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
        <system.serviceModel> 
        <services> 
         <service name="NamespaceChange01.BurgerMaster" behaviorConfiguration="mexServiceBehavior"> 
         <host> 
          <baseAddresses> 
          <add baseAddress="http://localhost:8080/NamespaceChange01"/> 
          </baseAddresses> 
         </host> 
         <endpoint name="basic" binding="basicHttpBinding" contract="NamespaceChange01.IBurgerMaster"/> 
         <endpoint name="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
         </service> 
        </services> 
        <behaviors> 
         <serviceBehaviors> 
         <behavior name="mexServiceBehavior"> 
          <serviceMetadata httpGetEnabled="true"/> 
         </behavior> 
         </serviceBehaviors> 
        </behaviors> 
        </system.serviceModel> 
    </configuration> 
    

Dzięki.

Odpowiedz

16

Dwa punkty końcowe (podstawowy i mex) nie mogły znajdować się na tym samym adresie. Dodaj konkretny adres dla jednego z nich (lub dla obu).

Na przykład:

<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
-2

Podczas tworzenia klasy usług, dlaczego oznaczyłeś ją atrybutem ServiceContract, tak jak mówi Twój kod?

[ServiceBehavior(Namespace = "http://MyService")] 
public class BurgerMaster : IBurgerMaster 

Usuń tę i spróbuj ponownie.

+1

-1 To jest błędne - kod OP jest całkowicie poprawny. Jest to konfiguracja, która jest niepoprawna –

5

Teraz brakuje adres atrybut z końcowym metadanych:

<endpoint name="mex" binding="mexHttpBinding" contract="IMetadataExchange" address="mex" /> 

Bez niego WCF myśli chcesz gospodarzem mex końcowy pod tym samym adresem.

+0

aplikacja kliencka używa mexHttpsBinding a serwer używa wsHttpsBinding, otrzymuję również ten sam błąd "Niezgodność wiązania klienta i usługi" –

Powiązane problemy