Skema URI yang disediakan 'https' tidak valid; diharapkan 'http'. Nama parameter: via

281

Saya mencoba untuk membuat layanan WCF lebih dari basicHttpBinding untuk digunakan lebih dari https. Inilah web.config saya:

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

Saya terhubung menggunakan WCFStorm yang dapat mengambil semua data meta dengan benar, tetapi ketika saya memanggil metode yang sebenarnya saya dapatkan:

Skema URI yang disediakan 'https' tidak valid; diharapkan 'http'. Nama parameter: via

isg
sumber
4
Dalam bahasa Jerman, pesan kesalahan bertuliskan " Das bereitgestellte URI-Schema" https "ist ungültig; erwartet wurde" http ". Parametername: via ", kalau-kalau ada orang yang googling ini.
Uwe Keim

Jawaban:

240

Coba tambahkan kredensial pesan di app.config Anda seperti:

<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
sumber
35
Terima kasih atas tanggapan ini kepada OP; Saya mengalami masalah yang sama dan mengubah mode tag <security> dari default "None" menjadi "Transport" yang memperbaikinya.
Otis
1
Kecuali untuk blok <message>, yang ditolak oleh IIS6 karena beberapa alasan, ini bekerja dengan baik.
Chris Chubb
4
menyalin konfigurasi yang sama ke proyek saya tetapi itu tidak memberikan efek apa pun. Apakah saya melewatkan sesuatu untuk ditambahkan?
1
Terima kasih banyak. Saya mencoba beberapa solusi yang ditemukan online tetapi tidak satupun yang berhasil. Yang ini sempurna.
aspnetdeveloper
59

Menambahkan ini sebagai jawaban, hanya karena Anda tidak dapat melakukan banyak format mewah dalam komentar.
Saya memiliki masalah yang sama, kecuali saya membuat dan mengikat klien layanan web saya sepenuhnya dalam kode.
Alasannya adalah DLL sedang diunggah ke dalam sistem, yang melarang penggunaan file konfigurasi.

Berikut adalah kode yang perlu diperbarui untuk berkomunikasi melalui 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
eidylon
sumber
Bagaimana Anda membuat kelas untuk layanan web Anda?
kaiyaq
berhasil! Saya memiliki masalah yang sama di C # saya. Cukup salin tempel dan masalah teratasi.
user3417479
@ Kaiyaq - Saya masih dapat terhubung ke layanan baik untuk pengembangan dengan semua hal standar, membiarkan VS membuat kelas untuk saya, yang kemudian dikompilasi ke dalam DLL. Hanya pada saat runtime saya tidak dapat mengunggah file konfigurasi dengan semua informasi koneksi.
eidylon
BasicHttpBinding hadir melalui penggunaan System.ServiceModel; Pembaca FYI masa depan.
DLeh
38

Ubah dari

<security mode="None">

untuk

<security mode="Transport">

di file web.config Anda. Perubahan ini memungkinkan Anda untuk menggunakan https alih-alih http

Amir Md Amiruzzaman
sumber
30

Apakah Anda menjalankan ini di Cassini (vs server dev) atau di IIS dengan sertifikat yang diinstal? Saya memiliki masalah di masa lalu yang mencoba menghubungkan titik akhir aman di server web dev.

Berikut ini adalah konfigurasi pengikatan yang telah bekerja untuk saya di masa lalu. Alih-alih basicHttpBinding, ia menggunakan wsHttpBinding. Saya tidak tahu apakah itu masalah bagi Anda.

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

dan titik akhir

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

Juga, pastikan Anda mengubah konfigurasi klien untuk mengaktifkan keamanan Transport.

Pattersonc
sumber
1
IIS 7 lokal dengan sertifikat yang ditandatangani sendiri diinstal
isg
13
"Juga, pastikan kamu mengubah konfigurasi klien untuk mengaktifkan keamanan Transport." -- Saran yang bagus. Terlalu mudah diabaikan dan WCF tidak akan memberikan petunjuk dalam kesalahannya.
Luke Puplett
tidak valid, negosiasikanServiceCredential dan
buildSecurityContext
20

Saya memiliki pengecualian yang sama dalam sebuah custom bindingskenario. Siapa pun yang menggunakan pendekatan ini, dapat memeriksanya juga.

Saya sebenarnya menambahkan referensi layanan dari local WSDL file. Itu berhasil ditambahkan dan diperlukan ikatan khusus ditambahkan ke file konfigurasi. Namun, layanan sebenarnya adalah https; bukan http. Jadi saya mengubah elemet httpTransport sebagai httpsTransport. Ini memperbaiki masalah

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

Referensi

  1. WCF dengan custombinding pada http dan https
LCJ
sumber
19

Saya memiliki masalah yang sama persis dengan OP. Konfigurasi dan situasiku sama. Saya akhirnya mempersempitnya menjadi masalah di WCFStorm setelah membuat referensi layanan dalam proyek uji di Visual Studio dan mengkonfirmasikan bahwa layanan itu berfungsi. Di Storm Anda perlu mengklik opsi pengaturan "Config" (BUKAN "Config Klien"). Setelah mengklik itu, klik pada tab "Keamanan" pada dialog yang muncul. Pastikan "Jenis Otentikasi" diatur ke "Tidak Ada" (Standarnya adalah "Otentikasi Windows"). Presto, berhasil! Saya selalu menguji metode saya di WCFStorm karena saya membangunnya, tetapi tidak pernah mencoba menggunakannya untuk terhubung ke yang sudah diatur di SSL. Semoga ini bisa membantu seseorang!

Randy Staats
sumber
Saya memiliki masalah yang sama persis, tetapi saya salah kata sandi menggunakan "Nama Pengguna / Otentikasi Kata Sandi". Ternyata jika Anda mengganti kata sandi, Anda perlu mengklik URL layanan dan tombol "Refresh" pada bilah alat untuk mengambilnya.
Ryan Shillington
12

Berlari ke masalah yang sama, inilah solusi saya yang pada akhirnya:

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

Saya pada dasarnya mengganti setiap kemunculan Http dengan Https. Anda dapat mencoba menambahkan keduanya jika Anda mau.

Shogun Gendut
sumber
5
Perlu dicatat bahwa basicHttpsBinding adalah 4,5 dan lebih baru.
Jagd
7

Jika Anda melakukan ini secara terprogram dan bukan di web.config:

new WebHttpBinding(WebHttpSecurityMode.Transport)
Terje Solem
sumber
Bagus. Saya selalu membenci file .exe.config, dan melakukan semuanya dengan kode. Ini menyelesaikan masalah saya.
nivs1978
4

Yang baik untuk diingat bahwa file konfigurasi dapat dipecah menjadi file sekunder untuk membuat perubahan konfigurasi lebih mudah pada server yang berbeda (dev / demo / produksi dll), tanpa harus mengkompilasi ulang kode / aplikasi dll. Misalnya kita menggunakannya untuk mengizinkan insinyur di tempat untuk membuat perubahan titik akhir tanpa benar-benar menyentuh file 'nyata'.

Langkah pertama adalah memindahkan bagian binding dari WPF App.Config ke file terpisah itu sendiri.

Bagian perilaku diatur untuk memungkinkan http dan https (tampaknya tidak mempengaruhi aplikasi jika keduanya diizinkan)

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

Dan kami memindahkan bagian binding ke file sendiri;

 <bindings configSource="Bindings.config" /> 

Dalam file bindings.config kita beralih keamanan berdasarkan protokol

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

Sekarang insinyur situs hanya perlu mengubah file Bindings.Config dan Client.Config tempat kami menyimpan URL aktual untuk setiap titik akhir.

Dengan cara ini kita dapat mengubah titik akhir dari http ke https dan kembali lagi untuk menguji aplikasi tanpa harus mengubah kode apa pun.

Semoga ini membantu.

api dingin
sumber
2

Untuk menutup kembali pertanyaan di OP:

Saya menghubungkan [ke layanan WCF] menggunakan WCFStorm yang dapat mengambil semua data meta dengan benar, tetapi ketika saya memanggil metode yang sebenarnya saya dapatkan:

Skema URI yang disediakan 'https' tidak valid; diharapkan 'http'. Nama parameter: via

Tutorial WCFStorm membahas masalah ini dalam Bekerja dengan IIS dan SSL .

Solusi mereka bekerja untuk saya:

  1. Untuk memperbaiki kesalahan, buat konfigurasi klien yang cocok dengan konfigurasi layanan WCF. Cara termudah untuk melakukan ini adalah dengan Visual Studio.

    • Buka Visual Studio dan tambahkan referensi layanan ke layanan. VS akan menghasilkan file app.config yang cocok dengan layanan

    • Edit file app.config sehingga dapat dibaca oleh WCFStorm. Silakan lihat Memuat file App.config Klien . Pastikan bahwa atribut kontrak titik akhir / @ nama dan titik akhir / @ cocok dengan nilai dalam wcfstorm.

  2. Muat app.config yang dimodifikasi ke WCFStorm [menggunakan tombol toobar Config Klien].

  3. Gunakan metode ini. Kali ini pemanggilan metode tidak akan lagi gagal

Butir (1) peluru terakhir yang berlaku berarti untuk menghapus awalan namespace yang VS bergantung pada atribut kontrak titik akhir, secara default "ServiceReference1"

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

jadi di app.config yang Anda muat ke WCFStorm yang Anda inginkan untuk ListsService:

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

Saya membutuhkan binding berikut untuk membuat tambang bekerja:

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

wsHttpBinding adalah masalah karena silverlight tidak mendukungnya!

Jason Henriksen
sumber
Untuk referensi: Tidak melakukan Windows Phone 7, Windows Phone 8 atau WinRT.
Jon B
Saya menambahkan jawaban untuk silverlight
Simon_Weaver