Lo schema URI fornito 'https' non è valido; "http" previsto. Nome del parametro: via


281

Sto cercando di creare un servizio WCF su basicHttpBinding da utilizzare su https. Ecco il mio web.config:

<!-- language: xml -->
<service behaviorConfiguration="MyServices.PingResultServiceBehavior"
         name="MyServices.PingResultService">
    <endpoint address="" 
              binding="basicHttpBinding" 
              bindingConfiguration="defaultBasicHttpBinding"
              contract="MyServices.IPingResultService">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange" />
</service>
...
<bindings>
  <basicHttpBinding>
    <binding name="defaultBasicHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
...
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServices.UpdateServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Mi sto collegando usando WCFStorm che è in grado di recuperare correttamente tutti i metadati, ma quando chiamo il metodo effettivo ottengo:

Lo schema URI fornito 'https' non è valido; "http" previsto. Nome del parametro: via


4
In tedesco, il messaggio di errore dice " Das bereitgestellte URI-Schema" https "è ungültig; erwartet wurde" http ". Nome parametro: via ", nel caso in cui qualcuno lo stia cercando.
Uwe Keim,

Risposte:


240

Prova ad aggiungere le credenziali dei messaggi sul tuo app.config come:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 

35
Grazie per questa risposta al PO; Stavo avendo lo stesso problema e cambiando la modalità del tag <security> dal valore predefinito di "Nessuno" a "Trasporto" è stato risolto.
Otis,

1
Fatta eccezione per il blocco <message>, che è stato rifiutato da IIS6 per qualche motivo, ha funzionato bene.
Chris Chubb,

4
ho copiato la stessa configurazione nel mio progetto, ma ciò non ha effetto. Ho perso qualcosa da aggiungere?

1
Grazie mille. Ho provato diverse soluzioni trovate online ma nessuna ha funzionato. Questo è stato perfetto.
aspnetdeveloper

59

Aggiungendo questo come risposta, proprio dal momento che non puoi fare molta formattazione nei commenti.
Ho avuto lo stesso problema, tranne per il fatto che stavo creando e vincolando il mio client del servizio web interamente nel codice.
Il motivo è che la DLL veniva caricata in un sistema, il che proibiva l'uso di file di configurazione.

Ecco il codice in quanto doveva essere aggiornato per comunicare su SSL ...

Public Function GetWebserviceClient() As WebWorker.workerSoapClient
    Dim binding = New BasicHttpBinding()
    binding.Name = "WebWorkerSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)

    '// HERE'S THE IMPORTANT BIT FOR SSL
    binding.Security.Mode = BasicHttpSecurityMode.Transport

    Dim endpoint = New EndpointAddress("https://myurl/worker.asmx")

    Return New WebWorker.workerSoapClient(binding, endpoint)
End Function

Come hai creato le lezioni per il tuo servizio web?
kaiyaq,

Funziona! Ho avuto lo stesso problema nel mio C #. Basta copiare incolla e problema risolto.
user3417479

@kaiyaq - Posso ancora connettermi bene al servizio per lo sviluppo con tutte le cose standard, lasciando che VS crei le classi per me, che poi vengono compilate nella DLL. È solo in fase di esecuzione. Non riesco a caricare il file di configurazione con tutte le informazioni sulla connessione.
eidylon,

BasicHttpBinding è presente tramite System.ServiceModel; FYI futuri lettori.
DLeh

38

Cambio da

<security mode="None">

per

<security mode="Transport">

nel tuo file web.config. Questa modifica ti consentirà di utilizzare https anziché http


30

Lo stai eseguendo su Cassini (vs server dev) o su IIS con un certificato installato? Ho avuto problemi in passato nel tentativo di collegare endpoint sicuri sul server web dev.

Ecco la configurazione dell'associazione che ha funzionato per me in passato. Invece di basicHttpBinding, usa wsHttpBinding. Non so se questo sia un problema per te.

<!-- Binding settings for HTTPS endpoint -->
<binding name="WsSecured">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <message clientCredentialType="None"
            negotiateServiceCredential="false"
            establishSecurityContext="false" />
    </security>
</binding>

e l'endpoint

<endpoint address="..." binding="wsHttpBinding"
    bindingConfiguration="WsSecured" contract="IYourContract" />

Inoltre, assicurarsi di modificare la configurazione del client per abilitare la sicurezza del trasporto.


1
IIS 7 locale con certificato
autofirmato

13
"Inoltre, assicurati di modificare la configurazione del client per abilitare la sicurezza del trasporto." -- Buon Consiglio. Troppo facilmente trascurato e WCF non fornirà indizi sui suoi errori.
Luke Puplett,

negoziazione non valida
ServiceCredential

20

Ho avuto la stessa eccezione in uno custom bindingscenario. Chiunque utilizzi questo approccio, può controllare anche questo.

In realtà stavo aggiungendo il riferimento al servizio da un local WSDL file. È stato aggiunto correttamente e è stata aggiunta l'associazione personalizzata richiesta al file di configurazione. Tuttavia, il servizio effettivo era https; non http. Quindi ho cambiato l'elemet httpTransport come httpsTransport. Ciò ha risolto il problema

<system.serviceModel>
<bindings>

  <customBinding>
    <binding name="MyBindingConfig">

      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
        messageVersion="Soap11" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>

      <!--Manually changed httpTransport to httpsTransport-->
      <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" 
        decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="65536" 
        proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
  </customBinding>

</bindings>

<client>
  <endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest"
    binding="customBinding" bindingConfiguration="MyBindingConfig"
    contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" />
</client>


</system.serviceModel>

Riferimenti

  1. WCF con associazione personalizzata su http e https

19

Ho avuto lo stesso problema ESATTO dell'OP. La mia configurazione e situazione erano identiche. Alla fine l'ho ridotto a un problema in WCFStorm dopo aver creato un riferimento al servizio in un progetto di test in Visual Studio e aver confermato che il servizio funzionava. In Storm è necessario fare clic sull'opzione delle impostazioni "Config" (NON LA "Configurazione client"). Dopo aver fatto clic su quello, fai clic sulla scheda "Sicurezza" nella finestra di dialogo che appare. Assicurati che "Tipo di autenticazione" sia impostato su "Nessuno" (L'impostazione predefinita è "Autenticazione di Windows"). Presto, funziona! Metto sempre alla prova i miei metodi in WCFStorm mentre li sto costruendo, ma non ho mai provato a usarlo per connettermi a uno che è già stato impostato su SSL. Spero che questo aiuti qualcuno!


Ho avuto lo stesso identico problema, ma avevo la password sbagliata usando "Autenticazione nome utente / password". Si scopre che se si modifica la password, è necessario fare clic sull'URL del servizio e sul pulsante "Aggiorna" sulla barra degli strumenti per poterlo prendere.
Ryan Shillington,

12

Ho affrontato lo stesso problema, ecco come è risultata la mia soluzione alla fine:

        <basicHttpsBinding>
            <binding name="VerificationServicesPasswordBinding">
              <security mode="Transport">
              </security>
            </binding>
            <binding name="VerificationServicesPasswordBinding1" />
        </basicHttpsBinding>

Ho praticamente sostituito ogni ricorrenza di Http con Https. Puoi provare ad aggiungere entrambi se preferisci.


5
Va notato che basicHttpsBinding è 4.5 e versioni successive.
Jagd,

7

Se lo fai in modo programmatico e non in web.config è:

new WebHttpBinding(WebHttpSecurityMode.Transport)

Grande. Ho sempre odiato i file .exe.config e invece faccio tutto per codice. Questo ha risolto il mio problema.
nivs1978,

4

È bene ricordare che i file di configurazione possono essere suddivisi su file secondari per facilitare le modifiche alla configurazione su server diversi (sviluppo / demo / produzione, ecc.), Senza dover ricompilare codice / app ecc. Ad esempio, li usiamo per consentire agli ingegneri in loco di apportare modifiche agli endpoint senza toccare i file "reali".

Il primo passo è spostare la sezione dei collegamenti dall'app WPF.Config nel suo file separato.

La sezione comportamenti è impostata per consentire sia http che https (non sembra influire sull'app se sono consentiti entrambi)

<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />

E spostiamo la sezione dei binding sul suo file;

 <bindings configSource="Bindings.config" /> 

Nel file bindings.config cambiamo la sicurezza in base al protocollo

  <!-- None = http:// -->
  <!-- Transport = https:// -->
  <security mode="None" >

Ora gli ingegneri sul posto devono solo modificare il file Bindings.Config e Client.Config in cui archiviamo l'URL effettivo per ciascun endpoint.

In questo modo possiamo modificare l'endpoint da http a https e viceversa per testare l'app senza dover modificare alcun codice.

Spero che questo ti aiuti.


2

Per ricapitolare la domanda nel PO:

Mi sto collegando [a un servizio WCF] utilizzando WCFStorm che è in grado di recuperare correttamente tutti i metadati, ma quando chiamo il metodo effettivo ottengo:

Lo schema URI fornito 'https' non è valido; "http" previsto. Nome del parametro: via

Le esercitazioni WCFStorm risolvono questo problema in Utilizzo di IIS e SSL .

La loro soluzione ha funzionato per me:

  1. Per correggere l'errore, generare una configurazione client che corrisponda alla configurazione del servizio wcf. Il modo più semplice per farlo è con Visual Studio.

    • Apri Visual Studio e aggiungi un riferimento al servizio. VS genererà un file app.config che corrisponde al servizio

    • Modifica il file app.config in modo che possa essere letto da WCFStorm. Vedere Caricamento dei file app.config del client . Assicurarsi che gli attributi endpoint / @ name e endpoint / @ contract corrispondano ai valori in wcfstorm.

  2. Caricare app.config modificato su WCFStorm [utilizzando il pulsante toobar Config client].

  3. Richiama il metodo Questa volta l'invocazione del metodo non fallirà più

L'elemento (1) ultimo punto attivo significa rimuovere il prefisso dello spazio dei nomi che VS antepone all'attributo del contratto endpoint, per impostazione predefinita "ServiceReference1"

<endpoint ... contract="ServiceReference1.ListsService" ... />

quindi nell'app.config che carichi in WCFStorm che desideri per ListsService:

<endpoint ... contract="ListsService" ... />

2

Avevo bisogno dei seguenti attacchi per far funzionare il mio:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>

1

wsHttpBinding è un problema perché silverlight non lo supporta!


Per riferimento: Né Windows Phone 7, Windows Phone 8 o WinRT.
Jon B

Ho aggiunto una risposta per silverlight
Simon_Weaver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.