152 messaggi dal 08 settembre 2006
buongiorno,
ho creato un servizio wcs con visual studio 2017 e framework 4.6.1; di default usa basicHttpBinding mentre nel mio caso devo usare wsHttpBinding e deve funzionare con protocollo HTTPS ; ho utilizzato queste impostazioni dentro web.config :

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1"/>
  </system.web>

  <system.serviceModel>
  
    <bindings>
      <!--<basicHttpBinding>
        <binding name="BasicHttpBinding_IVenService" maxReceivedMessageSize="2147483647" closeTimeout="10:30:00" openTimeout="10:30:00" receiveTimeout="10:30:00" sendTimeout="10:30:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        </binding>
      </basicHttpBinding>-->

      <wsHttpBinding>
        <binding name="wsHttpEndpointBinding" maxReceivedMessageSize="2147483647" closeTimeout="10:30:00" openTimeout="10:30:00" receiveTimeout="10:30:00" sendTimeout="10:30:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
            <!--<message clientCredentialType="Certificate" negotiateServiceCredential="true"
            algorithmSuite="Default" establishSecurityContext="true" />-->
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <client>
      <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" name="wsHttpEndpointBinding" contract="WcfService1.IService1" />
      <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
    </client>

    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="MyServiceBehavior">
        <!--<host>
          <baseAddresses>
            <add baseAddress="https://localhost/vdnService/service1"/>
          </baseAddresses>
        </host>-->
        <endpoint address="https://localhost/vdnService/Service1.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" 
                  name="wsHttpEndpointBinding" contract="WcfService1.IService1" />
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>    

    <behaviors>
      
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <!-- Per evitare la diffusione di informazioni sui metadati, 
impostare i valori seguenti su false prima della distribuzione -->
          <serviceMetadata httpGetEnabled ="true" httpsGetEnabled="true"/>
          <!-- Per ricevere i dettagli sull'eccezione per scopi di debug in caso di guasti, 
impostare il valore riportato sotto su true. 
Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sull'eccezione -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    
      <endpointBehaviors>
        <behavior name="MyEndpointBehavior">
          <clientCredentials>
            <clientCertificate findValue="miseservices.misericordia.it" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
            <!--<serviceCertificate>
                <authentication certificateValidationMode="PeerTrust"/>
              </serviceCertificate>-->
          </clientCredentials>
        </behavior>
      </endpointBehaviors>  
    
    </behaviors>

    <protocolMapping>
      <add binding="wsHttpBinding" scheme="https" bindingConfiguration="wsHttpEndpointBinding"/>
    </protocolMapping>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        Per sfogliare la directory radice dell'applicazione Web durante il debug, impostare il valore riportato sotto su true.
        Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sulla cartella dell'applicazione Web.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>


quando lancio il servizio dal client di visual studio viene restituito questo errore :

 
'Quando 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' è impostato su true
nella configurazione, 
è necessario specificare un indirizzo relativo per gli endpoint. 
Se nell'endpoint viene specificato un URI di ascolto relativo, 
sar&#8230; possibile utilizzare un indirizzo assoluto. 
Per risolvere il problema, specificare un URI relativo per l'endpoint 'https://localhost/vdnService/Service1.svc'. '


in precedenza non era presente l'indirizzo nel tag

<endpoint address="https://localhost/vdnService/Service1.svc"

dentro services

cioè era

<endpoint address=""


e l'errore restituito era :

 
Impossibile trovare un indirizzo di base corrispondente allo schema https per l'endpoint con binding WSHttpBinding. 
Gli schemi degli indirizzi di base registrati sono [http]. 


quindi sembra un problema dell'indirizzo specificato? come va scritto esattamente?

grazie
Modificato da bryger il 12 giugno 2018 16.01 -
Modificato da bryger il 12 giugno 2018 16.02 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
i percorsi vanno impostati in maniera relativa. Ad esempio, se nella tua applicazione ASP.NET hai un file Service1.svc, come percorso indica semplicemente Service1.svc.
<endpoint address="Service1.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding"
                  name="wsHttpEndpointBinding" contract="WcfService1.IService1" />


Poi...

Impossibile trovare un indirizzo di base corrispondente allo schema https per l'endpoint con binding WSHttpBinding.
Gli schemi degli indirizzi di base registrati sono [http].

E' normale se il webserver su cui stai testando il sito (IIS? IIS Express?) non ha alcun binding HTTPS. Infatti, tu hai esplicitamente richiesto la sicurezza a livello di trasporto.
<security mode="Transport">
   <transport clientCredentialType="None" />
</security>

...e quindi devi anche fare in modo che il sito abbia un binding HTTPS.

Ad esempio, ecco come abilitare un binding HTTPS su IIS Express.
https://www.codeproject.com/Tips/723357/Enabling-SSL-with-IIS-Express-in-Visual-Studio

Se hai problemi a far funzionare HTTPS su IIS Express, leggi qui:
https://www.pluralsight.com/guides/visual-studio-2017-resolving-ssl-tls-connections-problems-with-iis-express
Assicurati che la porta per HTTPS sia compresa tra 44300 e 44399 o potresti avere problemi.

Ho fatto una prova in locale, ti riporto il contenuto del mio nodo system.services.
 <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpEndpointBinding" maxReceivedMessageSize="2147483647" closeTimeout="10:30:00" openTimeout="10:30:00" receiveTimeout="10:30:00" sendTimeout="10:30:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="MyServiceBehavior">
        <endpoint address="Service1.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding"
                  name="wsHttpEndpointBinding" contract="WcfService1.IService1" />
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>


Ho visto che tu hai anche un nodo <client>. Ti serve effettivamente? Ti devi collegare a tua volta a un servizio esterno?

ciao,
Moreno

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
Ciao Moreno,
dopo l'invio del primo messaggio c'è stato un aggiornamento, ho provato a togliere del tutto l'indirizzo dentro endpoint e ho pubblicato così; facendo partire il wcf client di prova da visual studio (iis express) continua a non funzionare mentre chiamando il servizio pubblicato sul server dedicato, che ha il binding http e https, sembra che funzioni regolarmente, quindi non sto capendo; l'indirizzo serve o no? e perchè da wcf client lo chiede mentre dalla pubblicazione 'regolare' non ne ha bisogno? deduco sia per questo?

 
E' normale se il webserver su cui stai testando il sito (IIS? IIS Express?) non ha alcun binding HTTPS.
Infatti, tu hai esplicitamente richiesto la sicurezza a livello di trasporto.


quindi deduco che se metto l'indirizzo relativo come hai indicato e abilito il binding https su iis di visual studio funzionerà in entrambi i casi?

non chiamo poi nessun altro servizio esterno dal mio, quindi il nodo client si può eliminare?

Un'altra domanda, tutto questo casino è nato per via dell'uso di wsHttpBinding mentre con basic httpbiding funzionava regolarmente, anche usando https ma ho letto che la differenza è che usano due protocolli soap diversi quindi come mai tutte queste problematiche?

grazie come sempre
Modificato da bryger il 12 giugno 2018 21.35 -
Modificato da bryger il 12 giugno 2018 21.39 -
152 messaggi dal 08 settembre 2006
Buongiorno Moreno,
allora ho fatto altre prove, attivando il binding HTTPS su IIS express ha funzionato l'esecuzione anche dal client wcf di prova; inoltre ho appurato che ciò che scatena la modalità HTTPS è il tag

<security mode="Transport">
<transport clientCredentialType="None" />
</security>

come hai indicato, infatti togliendolo (mode=None" o mode = "Message") funziona anche senza il binding HTTPS

quello che non mi torna però è che il servizio funziona sia mettendo il binding HTTPS su IIS express sia pubblicando sul server web che ha già il binding anche senza inserire l'indirizzo, relativo, nella proprietà address; se invece non ho il binding HTTPS non funziona anche se metto l'indirizzo, quindi a che serve l'indirizzo?????

ultima domanda, usando basicHTTPBinding le configurazioni riguardo il protocollo HTTPS sarebbero state analoghe?

grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


quindi a che serve l'indirizzo?????

Non conosco gli internals di WCF così approfonditamente. Immagino che l'indirizzo in questo caso sia opzionale dato che esiste un file .svc fisico a determinare l'endpoint del servizio. In altre situazioni, ad esempio quando esponi un servizio WCF in un servizio per Windows, indicare l'indirizzo può essere più rilevante.


basicHTTPBinding le configurazioni riguardo il protocollo HTTPS sarebbero state analoghe?

Penso che usando basicHttpsBinding ti trovi già configurata la sicurezza a livello di trasporto senza che tu debba esplicitarla nel file config. Alla fine i binding altro non sono che dei preset che includono le varie funzionalità descitte dallo standard SOAP. Bisognerebbe andare a vedere il sorgente di BasicHttpsBinding per capire con quali parti viene assemblato il binding per avere la certezza.

Se per curiosità vuoi vedere quali sono queste parti che compongono i binding, ne trovi un elenco qui. Alcune sono obbligatorie (es. il message encoder che produce l'xml), altre opzionali (security binding per la firma digitale del messaggio).
Vedi qui al paragrafo "Osservazioni"
https://msdn.microsoft.com/it-it/library/system.servicemodel.channels.custombinding(v=vs.110).aspx

ciao,
Moreno
Modificato da BrightSoul il 14 giugno 2018 00.03 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.