Das angegebene URI-Schema 'https' ist ungültig. erwartet 'http'. Parametername: via

281

Ich versuche, einen WCF-Dienst über basicHttpBinding zu erstellen, der über https verwendet werden soll. Hier ist meine 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>

Ich verbinde mich mit WCFStorm, das alle Metadaten ordnungsgemäß abrufen kann, aber wenn ich die eigentliche Methode aufrufe, erhalte ich:

Das angegebene URI-Schema 'https' ist ungültig. erwartet 'http'. Parametername: via

isg
quelle
4
Auf Deutsch lautet die Fehlermeldung " Das bereitgestellte URI-Schema" https "ist ungültig; wurde wurde" http ". Parametername: via ", falls jemand dies googelt.
Uwe Keim

Antworten:

240

Fügen Sie Ihrer app.config folgende Anmeldeinformationen hinzu:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 
Jojo Sardez
quelle
35
Vielen Dank für diese Antwort an das OP; Ich hatte das gleiche Problem und habe den Modus des <Sicherheit> -Tags von der Standardeinstellung "Keine" auf "Transport" geändert, um das Problem zu beheben.
Otis
1
Mit Ausnahme des Blocks <message>, der aus irgendeinem Grund von IIS6 abgelehnt wurde, funktionierte dies gut.
Chris Chubb
4
kopierte die gleiche Konfiguration in mein Projekt, aber das ergibt nichts. Habe ich etwas verpasst, um hinzuzufügen?
1
Ich danke dir sehr. Ich habe mehrere online gefundene Lösungen ausprobiert, aber keine davon hat funktioniert. Dieser war perfekt.
Aspnetdeveloper
59

Fügen Sie dies als Antwort hinzu, nur weil Sie in Kommentaren nicht viel Lust auf Formatierung haben.
Ich hatte das gleiche Problem, außer dass ich meinen Webdienst-Client vollständig in Code erstellt und gebunden habe.
Grund dafür ist, dass die DLL in ein System hochgeladen wurde, das die Verwendung von Konfigurationsdateien untersagte.

Hier ist der Code, der aktualisiert werden musste, um über SSL zu kommunizieren ...

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
Eidylon
quelle
Wie haben Sie die Klassen für Ihren Webdienst erstellt?
Kaiyaq
Es klappt! Ich hatte das gleiche Problem in meinem C #. Einfach kopieren, einfügen und Problem lösen.
user3417479
@kaiyaq - Ich kann immer noch eine Verbindung zum Service für die Entwicklung mit allen Standardmaterialien herstellen, sodass VS die Klassen für mich erstellen kann, die dann in die DLL kompiliert werden. Es ist nur zur Laufzeit, dass ich die Konfigurationsdatei nicht mit allen Verbindungsinformationen hochladen kann.
Eidylon
BasicHttpBinding ist über System.ServiceModel vorhanden. Zu Ihrer Information zukünftige Leser.
DLeh
38

Wechsel von

<security mode="None">

zu

<security mode="Transport">

in Ihrer web.config-Datei. Mit dieser Änderung können Sie https anstelle von http verwenden

Amir Md Amiruzzaman
quelle
30

Führen Sie dies auf dem Cassini (vs dev server) oder auf IIS mit installiertem Zertifikat aus? Ich hatte in der Vergangenheit Probleme beim Versuch, sichere Endpunkte auf dem Dev-Webserver anzuschließen.

Hier ist die Bindungskonfiguration, die in der Vergangenheit für mich funktioniert hat. Stattdessen basicHttpBindingwird verwendet wsHttpBinding. Ich weiß nicht, ob das ein Problem für Sie ist.

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

und der Endpunkt

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

Stellen Sie außerdem sicher, dass Sie die Clientkonfiguration ändern, um die Transportsicherheit zu aktivieren.

pattersonc
quelle
1
lokales IIS 7 mit selbstsigniertem Zertifikat installiert
isg
13
"Stellen Sie außerdem sicher, dass Sie die Clientkonfiguration ändern, um die Transportsicherheit zu aktivieren." -- Guter Rat. Zu leicht übersehen und WCF gibt keine Hinweise auf seine Fehler.
Luke Puplett
ungültig verhandelnServiceCredential und EstablishmentSecurityContext
Kiquenet
20

Ich hatte die gleiche Ausnahme in einem custom bindingSzenario. Jeder, der diesen Ansatz verwendet, kann dies ebenfalls überprüfen.

Ich habe tatsächlich die Dienstreferenz aus einer local WSDL Datei hinzugefügt . Es wurde erfolgreich hinzugefügt und die erforderliche benutzerdefinierte Bindung wurde zur Konfigurationsdatei hinzugefügt. Der eigentliche Dienst war jedoch https; nicht http. Also habe ich das httpTransport-Element als geändert httpsTransport. Dies hat das Problem behoben

<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>

Verweise

  1. WCF mit Custombinding auf http und https
LCJ
quelle
19

Ich hatte genau das gleiche Problem wie das OP. Meine Konfiguration und Situation waren identisch. Ich habe es schließlich auf ein Problem in WCFStorm eingegrenzt, nachdem ich in einem Testprojekt in Visual Studio eine Dienstreferenz erstellt und bestätigt hatte, dass der Dienst funktioniert. In Storm müssen Sie auf die Einstellungsoption "Config" klicken (NICHT DIE "Client Config"). Nachdem Sie darauf geklickt haben, klicken Sie im daraufhin angezeigten Dialogfeld auf die Registerkarte "Sicherheit". Stellen Sie sicher, dass "Authentifizierungstyp" auf "Keine" eingestellt ist (die Standardeinstellung ist "Windows-Authentifizierung"). Presto, es funktioniert! Ich teste meine Methoden immer in WCFStorm, während ich sie ausbaue, habe aber nie versucht, eine Verbindung zu einer Methode herzustellen, die bereits über SSL eingerichtet wurde. Hoffe das hilft jemandem!

Randy Staats
quelle
Ich hatte genau das gleiche Problem, aber ich hatte das falsche Passwort mit "Benutzername / Passwort-Authentifizierung". Wenn Sie Ihr Kennwort ändern, müssen Sie auf die URL des Dienstes und die Schaltfläche "Aktualisieren" in der Symbolleiste klicken, damit es verwendet wird.
Ryan Shillington
12

Ich bin auf dasselbe Problem gestoßen, so stellte sich meine Lösung am Ende heraus:

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

Ich habe im Grunde jedes Vorkommen von HTTP durch HTTP ersetzt. Sie können versuchen, beide hinzuzufügen, wenn Sie dies bevorzugen.

Fetter Shogun
quelle
5
Zu beachten ist, dass basicHttpsBinding 4.5 und neuer ist.
Jagd
7

Wenn Sie dies programmgesteuert und nicht in web.config tun, gilt Folgendes:

new WebHttpBinding(WebHttpSecurityMode.Transport)
Terje Solem
quelle
Toll. Ich habe die .exe.config-Dateien immer gehasst und stattdessen alles per Code gemacht. Dies löste mein Problem.
nivs1978
4

Es ist gut daran zu denken, dass Konfigurationsdateien auf sekundäre Dateien aufgeteilt werden können, um Konfigurationsänderungen auf verschiedenen Servern (dev / demo / Production usw.) zu vereinfachen, ohne dass Code / App usw. neu kompiliert werden müssen. Zum Beispiel verwenden wir sie, um Ingenieuren vor Ort dies zu ermöglichen Nehmen Sie Endpunktänderungen vor, ohne die "echten" Dateien zu berühren.

Der erste Schritt besteht darin, den Bindungsabschnitt aus der WPF App.Config in eine eigene separate Datei zu verschieben.

Der Abschnitt "Verhalten" ist so eingestellt, dass sowohl http als auch https zulässig sind (scheint keine Auswirkungen auf die App zu haben, wenn beide zulässig sind).

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

Und wir verschieben den Bindungsabschnitt in eine eigene Datei.

 <bindings configSource="Bindings.config" /> 

In der Datei bindings.config wechseln wir die Sicherheit basierend auf dem Protokoll

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

Jetzt müssen die Ingenieure vor Ort nur noch die Datei Bindings.Config und die Datei Client.Config ändern, in der wir die tatsächliche URL für jeden Endpunkt speichern.

Auf diese Weise können wir den Endpunkt von http in https und wieder zurück ändern, um die App zu testen, ohne Code ändern zu müssen.

Hoffe das hilft.

Chillfire
quelle
2

So schließen Sie die Frage im OP erneut ab:

Ich verbinde [mit einem WCF-Dienst] über WCFStorm, das alle Metadaten ordnungsgemäß abrufen kann, aber wenn ich die eigentliche Methode aufrufe, erhalte ich:

Das angegebene URI-Schema 'https' ist ungültig. erwartet 'http'. Parametername: via

In den WCFStorm-Lernprogrammen wird dieses Problem unter Arbeiten mit IIS und SSL behandelt .

Ihre Lösung hat bei mir funktioniert:

  1. Um den Fehler zu beheben, generieren Sie eine Client-Konfiguration, die der Konfiguration des wcf-Dienstes entspricht. Der einfachste Weg, dies zu tun, ist mit Visual Studio.

    • Öffnen Sie Visual Studio und fügen Sie dem Dienst einen Dienstverweis hinzu. VS generiert eine app.config-Datei, die dem Dienst entspricht

    • Bearbeiten Sie die Datei app.config so, dass sie von WCFStorm gelesen werden kann. Weitere Informationen finden Sie unter Laden von Client App.config-Dateien . Stellen Sie sicher, dass die Attribute Endpunkt / @ Name und Endpunkt / @ Vertrag mit den Werten in wcfstorm übereinstimmen.

  2. Laden Sie die geänderte app.config in WCFStorm [über die Schaltfläche "Client Config toobar"].

  3. Rufen Sie die Methode auf. Diesmal schlägt der Methodenaufruf nicht mehr fehl

Das letzte Aufzählungszeichen von Element (1) bedeutet , dass das Namespace-Präfix , das VS dem Endpunktvertragsattribut voranstellt, standardmäßig "ServiceReference1" entfernt wird.

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

In der app.config, die Sie für ListsService in WCFStorm laden möchten:

<endpoint ... contract="ListsService" ... />
JohnC
quelle
2

Ich brauchte die folgenden Bindungen, um meine zum Arbeiten zu bringen:

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

wsHttpBinding ist ein Problem, da Silverlight es nicht unterstützt!

Jason Henriksen
quelle
Als Referenz: Windows Phone 7, Windows Phone 8 oder WinRT auch nicht.
Jon B
Ich habe eine Antwort für
Silverlight