Kesalahan startup layanan WCF "Koleksi ini sudah berisi alamat dengan skema http"

182

Saya membangun aplikasi web yang berisi kontrak layanan WCF dan kontrol Silverlight yang membuat panggilan ke layanan WCF. Pada pengembangan dan pengujian server saya ini berfungsi dengan baik.

Ketika saya menyebarkan ke server langsung kami dan menjalankan aplikasi saya mendapatkan pengecualian dari jenis System.ServiceModel.ServiceActivationExceptionyang menyatakan bahwa layanan tidak dapat diaktifkan karena pengecualian selama kompilasi. Pengecualiannya adalah:

Koleksi ini sudah berisi alamat dengan skema http. Paling tidak ada satu alamat per skema dalam koleksi ini.

Saya membaca bahwa pengecualian ini dapat dilemparkan jika situs web memiliki lebih dari satu header host, yang berlaku di server langsung kami. Rupanya layanan WCF yang di-host di IIS hanya dapat memiliki satu alamat basis. Bagaimana saya bisa mengatasi masalah ini?

Jeremy
sumber

Jawaban:

167

Di .Net 4, Anda dapat menggunakan multipleSiteBindingsEnabledopsi:

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

Kemudian, Anda tidak perlu menentukan setiap alamat.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

ericvg
sumber
Ya, tetapi ini hanya bekerja dengan .NET 4.0 dan lebih tinggi. Tidak dapat menggunakan ini dengan situs .NET 2.0 / 3.0 / 3.5.
Bytemaster
2
Catatan - ada kesalahan ketik di sini - tidak ada penutupan>, jadi jika Anda menyalin dan menempel, Anda akan mengalami masalah
sydneyos
2
Itu tidak akan berfungsi untuk pertanyaan ini: "Fungsi ini hanya tersedia menggunakan protokol HTTP."
George Tsiokos
146

Ringkasan,

Solusi kode: Di sini

Solusi konfigurasi: Di sini

Dengan bantuan Mike Chaliy , saya menemukan beberapa solusi tentang cara melakukan ini melalui kode. Karena masalah ini akan mempengaruhi hampir semua proyek yang kami gunakan ke lingkungan langsung, saya mengulurkan untuk solusi konfigurasi murni. Saya akhirnya menemukan satu yang merinci cara melakukannya di .net 3.0 dan .net 3.5.

Diambil dari situs, di bawah ini adalah contoh cara mengubah konfigurasi web aplikasi Anda:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

Dalam contoh di atas, net.tcp: //payroll.myorg.com: 8000 dan http://shipping.myorg.com:9000 adalah satu-satunya alamat dasar, untuk skema masing-masing, yang akan diizinkan untuk dilewati. BaseAddressPrefixFilter tidak mendukung wildcard.

BaseAddresses yang disediakan oleh IIS mungkin memiliki alamat yang terikat ke skema lain yang tidak ada dalam daftar baseAddressPrefixFilter. Alamat-alamat ini tidak akan disaring.

Solusi Dns (belum diuji): Saya pikir jika Anda membuat entri dns baru khusus untuk aplikasi web Anda, menambahkan situs web baru, dan memberikannya satu header host yang cocok dengan entri dns, Anda akan mengurangi masalah ini sama sekali, dan tidak akan mengurangi masalah ini sama sekali, dan tidak akan harus menulis kode khusus atau menambahkan awalan ke file web.config Anda.

Jeremy
sumber
2
Menambahkan filter awalan alamat dasar ke web.config bekerja dengan sempurna. Jeremy terima kasih!
Mike737
2
Saya tidak bisa memikirkan alasan mengapa salah satu ingin pembatasan tersebut, apalagi pengaturan default ...
PBZ
42
Saya mulai berpikir buruk tentang WCF dalam kombinasi dengan ASP.net dan layanan web yang diakses melalui JavaScript. Saya memiliki lebih sedikit masalah dengan layanan ASMX lama yang biasa ...
Juri
Oke bagaimana jika Anda memiliki situs dengan campuran aplikasi .net 4 dan .net 2 yang berjalan di bawahnya. Basis aplikasi .net4 dan ada beberapa aplikasi di bawahnya yang membutuhkan .net2. Apakah Anda menggunakan <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> di semua file .net4 dan awalan dalam aplikasi .net 2?
Travis
59

Apakah Anda melihat ini - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Anda dapat mengatasi kesalahan ini dengan mengubah file web.config.

Dengan ASP.NET 4.0, tambahkan baris berikut ke web.config Anda:

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

Dengan ASP.NET 2.0 / 3.0 / 3.5, tambahkan baris berikut ke web.config Anda:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 
Mike Chaliy
sumber
Terima kasih. Saya akan terus mencari untuk melihat apakah tidak ada solusi kode. Sesuatu yang dapat dilakukan dalam konfigurasi karena ini akan memengaruhi setiap proyek yang kami lakukan. Saya berharap tidak harus menulis kode khusus.
Jeremy
16

Dalam kasus root saya penyebab masalah ini adalah beberapa binding http didefinisikan di situs web induk yaitu InetMgr-> Sites-> Mysite-> properties-> EditBindings. Saya menghapus satu http binding yang tidak diperlukan dan masalah teratasi.

Amar
sumber
1
Ya Amar ini sangat membantu - dalam kasus saya itu adalah situs LAINNYA dengan beberapa ikatan yang memecahkannya. Tersedia secara eksternal pada mesin yang sama (tetapi dengan Hostname berbeda). Sama itu bisa diperbaiki dengan menambahkan pengaturan multipleSiteBindingsEnabled tetapi kemudian web.config akan berbeda dari semua lingkungan lainnya.
The Coder
2
Sangat disayangkan ini di bagian bawah. Dalam kasus kami ini memperbaikinya untuk kami.
brendonparker
Ini membantu saya untuk mereplikasi kesalahan dalam lingkungan pengembangan. Saya tidak dapat mengedit ikatan situs web dalam sertifikasi maupun lingkungan langsung. Saya telah mengubah file host saya untuk mensimulasikan domain dan menambahkan binding ke IIS lokal dan bam!
MFedatto
8

Dan dalam kasus saya itu sederhana: Saya menggunakan wizard 'Tambahkan Layanan WCF' di Visual Studio, yang secara otomatis membuat bagian yang sesuai di app.config. Kemudian saya melanjutkan membaca Cara: Host Layanan WCF dalam Aplikasi yang Dikelola . Masalahnya adalah: Saya tidak perlu menentukan url untuk menjalankan layanan web.

Menggantikan:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

Dengan:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

Dan kesalahannya hilang.

Gagasan umum: jika Anda memberikan alamat dasar sebagai param dan menentukannya dalam konfigurasi, Anda mendapatkan kesalahan ini. Kemungkinan besar, itu bukan satu-satunya cara untuk mendapatkan kesalahan, kamu.

bohdan_trotsenko
sumber
Memecahkan masalah saya.
QShengyao
2

Saya punya masalah ini, dan penyebabnya agak konyol. Saya mencoba demo Microsoft tentang menjalankan ServiceHost dari w / dalam dieksekusi Command Line. Saya mengikuti instruksi, termasuk di mana dikatakan untuk menambahkan Layanan (dan antarmuka) yang sesuai. Tapi saya mendapat kesalahan di atas.

Ternyata ketika saya menambahkan kelas layanan, VS secara otomatis menambahkan konfigurasi ke app.config. Dan demo juga mencoba menambahkan info itu. Karena sudah ada di konfigurasi, saya menghapus bagian demo, dan itu berhasil.

Eric
sumber
0

Saya datang dengan kesalahan yang sama pada Exchange Server 2010 yang lama. Layanan (layanan replikasi kotak surat Exchange) memberikan kesalahan di atas dan proses migrasi tidak dapat dilanjutkan. Mencari melalui internet, saya datang dengan tautan ini yang menyatakan di bawah ini:

Exchange GRE gagal dibuka saat diinstal untuk pertama kalinya atau jika ada perubahan yang dilakukan ke server IIS. Gagal dengan snap-in error dan ketika Anda mencoba untuk membuka halaman snap-in, konten berikut ini ditampilkan:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Penyebab : Kesalahan ini terjadi karena nomor port http 443 sudah digunakan oleh aplikasi lain dan server IIS tidak dikonfigurasi untuk menangani beberapa pengikatan ke port yang sama.

Solusi : Konfigurasikan server IIS untuk menangani beberapa binding port. Hubungi vendor (Microsoft) untuk mengkonfigurasinya.

Karena layanan ini ditawarkan dari IIS Web Server, memeriksa Binding pada Situs Root memperbaiki masalah. Seseorang telah mengacaukan Bindings Situs, mendefinisikan aturan yang tumpang tindih dengan diri mereka sendiri dan mengacaukan layanan.

Memperbaiki Bindings yang benar menyelesaikan masalah, dalam kasus saya, dan saya tidak perlu mengkonfigurasi Web.Config.

jimas13
sumber