2011-01-10 16 views
13

Stworzyłem i przetestowałem usługę WCF, wszystko działa dobrze.Usługa WCF w środowisku https

Kiedy wdrożony do środowiska testowego i próbował otworzyć https://my.site/myapp/EnrollmentService.svc Mam komunikat o błędzie:

nie mógł znaleźć adres bazowy, który mecze schemat http dla punktu końcowego z obowiązującymi MetadataExchangeHttpBinding. Zarejestrowane schematy adresów bazowych to [https].

Internet pokazał mi, że muszę dodać kilka dodatkowych opcji konfiguracyjnych:

http://www.codeproject.com/KB/WCF/7stepsWCF.aspx

Dodałem niektóre ustawienia do obsługi pliku web.config. Teraz wygląda to następująco:

<system.serviceModel> 
<services> 
    <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior"> 
    <endpoint 
     address="https://my.site/myapp/EnrollmentService.svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="TransportSecurity" 
     contract="McActivationApp.IEnrollmentService"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="McActivationApp.IEnrollmentService" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="McActivationApp.EnrollmentServicBehavior"> 
     <serviceMetadata httpGetEnabled="True"/> 
     <serviceDebug includeExceptionDetailInFaults="False" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <basicHttpBinding> 
    <binding name="TransportSecurity"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

Właściwie dodałem sekcję "wiązania" i określiłem ją dla mojego punktu końcowego.

Ale to nic nie zmieniło ...

Proszę doradzić, co muszę zrobić. Wielkie dzięki!

P.S. Czy są jakieś różnice w usługach WCF zużywających zasoby https i http?

Odpowiedz

19

Jeśli chcesz udostępnić swoją usługę tylko za pośrednictwem protokołu HTTPS (witryna w ogóle nie obsługuje protokołu HTTP), nie można użyć niczego zależnego od protokołu HTTP. Twoja aktualna konfiguracja powoduje odsłonięcie strony pomocy dotyczącej protokołu HTTP oraz mex endpoing (z nieprawidłową umową) na HTTP. Wypróbuj to:

<system.serviceModel> 
    <services> 
    <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">  
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" contract="McActivationApp.IEnrollmentService"/>  
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors>  
     <behavior name="McActivationApp.EnrollmentServicBehavior">   
     <serviceMetadata httpsGetEnabled="True"/>  
     <serviceDebug includeExceptionDetailInFaults="False" />  
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding>  
     <binding name="TransportSecurity">  
     <security mode="Transport">   
      <transport clientCredentialType="None" />  
     </security>  
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />  
</system.serviceModel> 
+1

Czy poprawnie zrozumiałem, że tutaj: 1) zmieniono wiązanie mex z mexHttpBinding na mexHttpsBinding i 2) zastąpiono httpGetEnabled przez httpsGetEnabled .Tak? Tak, to działa również. Dzięki – Budda

+1

Tak, to co zrobiłem + zmieniono umowę na mex i usunięto pierwszy adres punktu końcowego, ponieważ nie jest używany, gdy usługa jest hostowana w IIS. –

+0

Dziękuję za pomoc! – Budda

1

Aby rozwiązać ten problem, pozwalając HTTP, trzeba dodać http wiążącej w IIS:

  1. Przejdź do witryny w IIS
  2. kliknij „Wiązania ...” w panelu Operacje na prawo.
  3. Kliknij "Dodaj"
  4. Wybierz "http" i OK.

Alternatywnie, można uniknąć problemu albo przez usunięcie linii lub zmiana:

<serviceMetadata httpGetEnabled="True"/> 

do:

<serviceMetadata httpsGetEnabled="True"/> 
+0

Świetnie! Wielkie dzięki! – Budda

+0

... ale ... po tej zmianie strona zaczęła działać pod zwykłym "http", który nie jest dozwolony ... – Budda

5

Masz http metadanych końcowy, który powinien zostać zmieniony na https jak poniżej.

<serviceMetadata httpsGetEnabled="True"/> 

Również, jeśli nie jest to konieczne, należy usunąć punkt końcowy metadanych mex i https z produkcji jako najlepszą praktykę.

+1

Czy poprawnie rozumiem, że muszę dodać, że w ""? Czy mogę usunąć powiązanie dla http dla tego przypadku? Jeśli dodać ten atrybut i usunąć wiążące "serviceMetadata" już otrzymuję ten sam komunikat o błędzie .. Proszę doradzić – Budda

+0

Rzeczą, którą również trzeba było zmienić, jest usunięcie (uwaga: nazwa atrybutu nie zawiera "s") i usunięcie punktu końcowego "mex" ... – Budda

+0

To właśnie miałem na myśli, zmień z httpGetEnabled na httpsGetEnabled – softveda