2009-06-04 9 views
11

W naszym projekcie mamy usługę WWW java, która działa na http i https. Chcemy używać http wewnętrznie i https dla zewnętrznej wersji naszej aplikacji internetowej.Wywołanie usługi sieci Web za pomocą WCF przez HTTP i Https

Stworzyliśmy klasę proxy w naszej aplikacji i ustawiliśmy powiązanie dla http w pliku web/app.config i wszystko działa poprawnie.

Jakie zmiany należy wprowadzić w kodzie i konfiguracji, aby obsługiwać https dla tej samej usługi w naszej aplikacji zewnętrznej? Jeśli to możliwe, podaj fragmenty kodu, aby wyjaśnić!

Odpowiedz

0

proszę zobaczyć Configuring HTTP and HTTPS:

Using Windows Communication Foundation (WCF) over HTTP either requires the use of a host, such as Internet Information Services (IIS), or manual configuration of the HTTP settings through the HTTP Server API. This document describes manually configuring WCF when using HTTP and HTTPS.

a także zobaczyć WCF Bindings Needed For HTTPS:

I just finished writing my first production WCF application, which worked very well until I deployed it to our production environment. All of a sudden none of the WCF calls would work, and I would get a JavaScript "TestService is not defined" error. When I look inside the JS service reference (in debug mode), I got the following error:

Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding. Registered base address schemes are [https]

So apparently my WCF service registered itself as HTTPS (since it is over SSL), but my binding was only configured for HTTP. The solution is to define a custom binding inside your Web.Config file and set the security mode to "Transport". Then you just need to use the bindingConfiguration property inside your endpoint definition to point to your custom binding. The entire HTTPS-enabled system.serviceModel section is below:

0

Rozumiem, że używasz WCF zbudować klienta, który łączy się ze zdalnym usługi internetowej, za pośrednictwem protokołu HTTPS.

Aby to zrobić, po prostu zmodyfikuj plik konfiguracyjny po stronie klienta dla aplikacji korzystającej z WCF, zastępując http://server.address przez https://server.address, w pliku configuration/system.serviceModel/client/endpoint/@address. tak:

<configuration> 
    <system.serviceModel> 
    ... 
    <client> 
     <!-- change only the address string --> 
     <endpoint address="https://server.name/Whatever" 
      everything.else.stays.the.same /> 

    </client> 
    </system.serviceModel> 
</configuration> 

(ścieżka do pliku konfiguracyjnego zależy od zwykłych zasad .NET: czy to app ASPNET lub usługi, lub etc.)

lub można ustawić adres jawnie w kodzie:

// instantiate new proxy to web service 
    var svc= new ServiceClient(); 
    var e = svc.Endpoint; 
    e.Address = new System.ServiceModel.EndpointAddress("https://server.address/JavaServiceUri"); 

Zdecydowanie radzę, aby adres był konfigurowalny, a nie na sztywno. To nie znaczy, że musi być przechowywany w app.config, ale powinien być zmienny. Proxy też.

+0

to nie zadziała na moją sytuację, to wyniki w systemie. ArgumentException z komunikatem "Dostarczony schemat identyfikatora" https "jest nieprawidłowy, oczekiwano" http "." – RenniePet

2

Zakładam, że używasz basichttpbinding. Potem trzeba zrobić dwie rzeczy:

  • zmiany adresu https :)
  • ustawić tryb bezpieczeństwa transportu
+0

fajnie - łączenie z tym samym pytaniem :) – Rory

+0

@Rory, fajny połów, odpowiedź istnieje od ponad roku, jesteś pierwszy, który zauważysz :) –

+0

Oczywiste, jak twoja odpowiedź, to tylko zaoszczędziło mi potencjalnie godzin. "Zakładam, że używasz basichttpbinding." Mój SLL pracował dla SOAP, ale nie działa on dla webHttpBinding -REST. Teraz, gdy zidentyfikowałem problem, mogę zacząć naprawiać :) – Doomsknight

22

znalazłem odpowiedź kopanie wokół MSDN.

W moim przypadku był przy użyciu niestandardowych Oprawa:

<customBinding> 
    <binding name="jsonpBinding"> 
     <jsonpMessageEncoding/> 
     <httpTransport manualAddressing="true"/> 
    </binding> 
</customBinding> 

To był wymieniony w służbie

<services> 
    <service name="{YourInfoHere}"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/> 
    </service> 
</services> 

dodanie drugiego wiązania, które wykorzystywane httpsTransport a następnie drugi serwis, który stosowany że Wiązanie załatwiło sprawę. Wynik końcowy:

<services> 
     <service name="{YourInfoHere}"> 
      <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/> 
      <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBindingHttps" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/> 
     </service> 
    </services> 
    <bindings> 
     <customBinding> 
      <binding name="jsonpBinding"> 
       <jsonpMessageEncoding/> 
       <httpTransport manualAddressing="true"/> 
      </binding> 
      <binding name="jsonpBindingHttps"> 
       <jsonpMessageEncoding/> 
       <httpsTransport manualAddressing="true" /> 
      </binding> 
     </customBinding> 
    </bindings> 

Może nie być idealny, ale działa. To były jedyne zmiany, które wprowadziłem, aby SSL działał. Ponieważ wszystko jest w przewozie wiążącym &, kod pozostaje taki sam.

Istotne linki MSDN:

  1. klienta Oprawa: http://msdn.microsoft.com/en-us/library/ms731377.aspx
  2. HttpTransport: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.httptransportbindingelement.aspx
  3. HttpsTransport: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.httpstransportbindingelement.aspx
+3

+1 - Dokładnie to, czego szukałem :) –