2011-09-16 9 views
11

Wiem, że to pytanie było wielokrotnie zadawane i wiele razy odpowiadał, ale wszystkie dostarczone próbki, które powinny pracować don Wydaje mi się, że chcesz dzisiaj pracować dla mnie.mexHttpBinding - Dodaj ServiceMetadataBehavior do pliku konfiguracyjnego lub do ServiceHost bezpośrednio, aby włączyć obsługę tego kontraktu

Kiedy próbuję uruchomić hosta, wciąż otrzymuję następujący błąd:.

„Nazwa kontraktu«IMetadataExchange»nie można odnaleźć na liście zamówień realizowanych przez TraceService serwisu Dodaj ServiceMetadataBehavior do plik konfiguracyjny lub bezpośrednio do ServiceHost, aby umożliwić obsługę tego kontraktu. "

Moja usługa jest obsługiwana w zarządzanym hoście usługi Windows, jak na przykład Microsoft: http://msdn.microsoft.com/en-us/library/ms733069%28v=vs.90%29.aspx

i tu jest mój miły i prosty config:

<system.serviceModel> 
    <services> 
     <service name="Daff.Lae.Service.TraceService"> 
     <endpoint address="" binding="wsHttpBinding" name="TraceService" contract="Contracts.Service.ITraceService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8080/TraceService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Oczywiście, problem staje się bardziej interesująca, gdy nie ma błędów, jeśli usuniemy tę linię:

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

Każda pomoc będzie bardzo, bardzo, bardzo doceniona :)

Odpowiedz

24

Należy podać behaviorConfiguration w elemencie service konfiguracji, aby umożliwić albo httpGet lub httpsGet.

widzę, że już zdefiniował serviceBehavior nazwie DefaultBehavior - teraz wszystko, co musisz zrobić, to dodać behaviorConfiguration="DefaultBehavior" do elementu service, tak że staje się linia:

<service name="Daff.Lae.Service.TraceService" behaviorConfiguration="DefaultBehavior"> 

Jeśli nie jawnie określić zachowanie usługi, zarówno HTTP GET, jak i HTTPS GET są domyślnie zabronione, a twoje metadane nie zostaną ujawnione.

+0

domyślne zachowanie jest już obecne w mojej konfiguracji. – agAus

+0

@agAus - Tak, ale nie określiłeś, że twoja usługa ma używać domyślnego zachowania. Musisz dodać atrybut "behaviorConfiguration" do elementu "service" w twojej konfiguracji, jak pokazano w mojej odpowiedzi. – RoccoC5

+0

Zmieniono moją odpowiedź dla jasności. – RoccoC5

2

Podczas korzystania z WS-Http wiążesz się z protokołem HTTPS, więc musisz użyć poprawnego powiązania MEX;

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 

i zmień adres bazowy na https.

Albo (na odwrót) przekonwertuj wiązanie wsHttp do powiązania basicHttp i wszystko zacznie działać.

+0

Ahh ... Nie wiedziałem, że wsHttpBinding oznaczało, że było https? Jestem dzisiaj związany z produkcją prod, ale zdecydowanie chciałbym spróbować i wrócić do ciebie. Zrobiłem zakładkę do mojego pytania, aby odpowiednio zaktualizować wpis. Dzięki :) – agAus

0
`<services> 
    <service name="MyService.Service1" behaviorConfiguration="Service1" > 

</services> 
` 

where MyService is the application name , Service1 is the default implementation class for IService1 
` 
<protocolMapping> 
    //Remove any http or https bindings provided 
</protocolMapping> 
` 
It should help when you use WCF Application Project 
Powiązane problemy