WCF hizmeti başlatma hatası “Bu koleksiyon zaten şema http'ye sahip bir adres içeriyor”


182

Bir WCF hizmet sözleşmesi ve bu WCF hizmetine çağrı yapan bir Silverlight denetimi içeren bir web uygulaması oluşturdum. Geliştirme ve test sunucularımda harika çalışıyor.

Canlı sunucumuza dağıtıp uygulamayı çalıştırdığımda, System.ServiceModel.ServiceActivationExceptionderleme sırasında bir özel durum nedeniyle hizmetin etkinleştirilemeyeceğini belirten bir tür istisna alıyorum . İstisna:

Bu koleksiyon zaten http şemasına sahip bir adres içeriyor. Bu koleksiyonda şema başına en fazla bir adres olabilir.

Web sitesinde birden fazla ana bilgisayar üstbilgisi varsa bu istisnanın atılabileceğini okudum, bu da canlı sunucumuzda geçerlidir. Görünüşe göre IIS'de barındırılan WCF hizmetlerinin yalnızca bir temel adresi olabilir. Bu sorunu nasıl çözebilirim?

Yanıtlar:


167

.Net 4'te multipleSiteBindingsEnabledseçeneği kullanabilirsiniz :

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

Ardından, her adresi belirtmeniz gerekmez.

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


Evet, ancak bu yalnızca .NET 4.0 ve sonraki sürümlerle çalışır. Bu, .NET 2.0 / 3.0 / 3.5 siteleriyle kullanılamıyor.
Bytemaster

2
Not - burada bir yazım hatası var - kapanış yok>, bu yüzden kopyalayıp yapıştırırsanız sorun
yaşarsınız

2
Bu soru için işe yaramaz: "Bu işlev yalnızca HTTP protokolü kullanılarak kullanılabilir."
George Tsiokos

146

Özet,

Kod çözümü: İşte

Yapılandırma çözümleri: İşte

Yardımıyla Mike Chaliy , kod aracılığıyla bu nasıl yapılacağına ilişkin bazı çözümler bulduk. Bu sorun, tamamen yapılandırma çözümü için gerçekleştirdiğim canlı bir ortama dağıttığımız tüm projeleri hemen hemen etkileyecek. Sonunda .net 3.0 ve .net 3.5'te nasıl yapılacağını ayrıntılarıyla buldum.

Siteden alındığında, uygulama web yapılandırmanızı nasıl değiştireceğinizin bir örneği aşağıdadır:

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

Yukarıdaki örnekte, net.tcp: //payroll.myorg.com: 8000 ve http://shipping.myorg.com:9000 , ilgili şemaları için geçirilmesine izin verilecek tek temel adreslerdir. BaseAddressPrefixFilter herhangi bir joker karakteri desteklemez.

IIS tarafından sağlanan baseAddresses, baseAddressPrefixFilter listesinde bulunmayan diğer şemalara bağlı adreslere sahip olabilir. Bu adresler filtrelenmeyecek.

Dns çözümü (denenmemiş): Web uygulamanıza özel yeni bir dns girişi oluşturduysanız, yeni bir web sitesi eklediyseniz ve dns girişiyle eşleşen tek bir ana bilgisayar başlığı verdiyseniz, bu sorunu tamamen azaltacağınızı ve web.config dosyanıza özel kod yazmanız veya önek eklemeniz gerekir.


2
Web.config dosyasına temel adres önek filtresini eklemek mükemmel çalıştı. Teşekkürler Jeremy!
Mike737

2
Neden böyle bir kısıtlama, çok daha az varsayılan ayar istemek için herhangi bir neden düşünemiyorum ...
pbz

42
ASP.net ve JavaScript üzerinden erişilen web hizmetleri ile birlikte WCF hakkında kötü düşünmeye başladım. Sade eski ASMX hizmetlerinde çok daha az sorun yaşadım ...
Juri

Tamam .net 4 ve .net 2 uygulamalarının altında çalışan bir siteniz varsa ne olur. Uygulamanın tabanı .net4'tür ve altında .net2 gerektiren birkaç uygulama vardır. Tüm .net4 dosyalarında <.netHostingEnvironment multipleSiteBindingsEnabled = "true"> ve .net 2 uygulamalarında önek kullanıyor musunuz?
Travis

59

Bunu gördün mü - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Bu hatayı web.config dosyasını değiştirerek çözebilirsiniz.

ASP.NET 4.0 ile web.config dosyasına aşağıdaki satırları ekleyin:

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

ASP.NET 2.0 / 3.0 / 3.5 ile web.config dosyasına aşağıdaki satırları ekleyin:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

Teşekkürler. Kod çözümü olup olmadığını görmek için aramaya devam edeceğim. Yapılandırmada yapılabilecek bir şey, bu yaptığımız herhangi bir projeyi etkileyeceğinden, özel kod yazmak zorunda olmadığımı umuyorum.
Jeremy

16

Benim durumumda bu sorunun temel nedeni, InetMgr-> Siteler-> Sitem-> özellikleri-> EditBindings üst web sitesinde tanımlanmış birden çok http bağlama oldu. Gerekli olmayan bir http bağlayıcısını sildim ve sorun çözüldü.


1
Evet Amar bu çok yardımcı oldu - benim durumumda o kırdı birden çok bağlama ile başka bir Web sitesi oldu . Harici olarak aynı makinede kullanılabilir (ancak farklı bir Ana Bilgisayar Adıyla). Aynı şekilde, multipleSiteBindingsEnabled ayarı eklenerek düzeltilebilir, ancak web.config diğer ortamlardan farklı olur.
Kodlayıcı

2
Bu altta bir utanç. Bizim durumumuzda bu bizim için düzeltildi.
brendonparker

Geliştirme ortamındaki hatayı tekrarlamama yardımcı oldu. Web sitesi bağlantılarını ne sertifika ne de canlı ortamlarda düzenleyemiyorum. Bir etki alanını taklit etmek için ana makinelerimi değiştirdim ve yerel IIS ve bam'ya bağlantılar ekledim!
MFedatto

8

Benim durumumda basitti: Visual Studio'da app.config dosyasında otomatik olarak karşılık gelen bölümler oluşturan 'WCF Hizmeti Ekle' sihirbazını kullandım. Sonra nasıl yapılır: Yönetilen bir Uygulamada bir WCF Hizmeti Barındırma okumaya devam ettim . Sorun şuydu: Web hizmetini çalıştırmak için URL belirtmemize gerek yoktu.

Değiştir:

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

İle:

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

Ve hata gitti.

Genel fikir: temel adresi bir parametre olarak sağlarsanız ve config içinde belirtirseniz, bu hatayı alırsınız. Büyük olasılıkla, hatayı almanın tek yolu bu değil, sen.


Sorunumu çözdüm.
QShengyao

2

Bu problemim vardı ve sebebi oldukça aptalca. Bir komut satırı yürütülebilir w / dan bir ServiceHost çalıştırma ile ilgili Microsoft'un demo deniyordu. Uygun Hizmeti (ve arabirimi) ekleyeceği yer de dahil olmak üzere talimatları izledim. Ama yukarıdaki hatayı aldım.

Hizmet sınıfını eklediğimde, VS otomatik olarak yapılandırmayı app.config dosyasına ekledi. Demo da bu bilgiyi eklemeye çalışıyordu. Zaten yapılandırmada olduğundan, demo bölümünü kaldırdım ve işe yaradı.


0

Eski bir 2010 Exchange sunucusunda aynı hatayla geldi. Bir hizmet (Exchange posta kutusu çoğaltma hizmeti) yukarıdaki hatayı veriyordu ve taşıma işlemine devam edilemedi. İnternette arama yaparken, aşağıda belirtilen bu bağlantıyla geldim :

Exchange GRE ilk kez yüklendiğinde veya IIS sunucusunda herhangi bir değişiklik yapıldığında açılmaz. Ek bileşen hatasıyla başarısız olur ve ek bileşen sayfasını açmaya çalıştığınızda aşağıdaki içerik görüntülenir:

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'."

Sebep olmak : Bu hata, 443 numaralı bağlantı noktası numarası başka bir uygulama tarafından zaten kullanıldığından ve IIS sunucusunun aynı bağlantı noktasına birden çok bağlamayı işleyecek şekilde yapılandırılmamış olması nedeniyle oluşur.

Çözüm : IIS sunucusunu birden çok bağlantı noktası bağlama işleyecek şekilde yapılandırın. Yapılandırmak için satıcınıza (Microsoft) başvurun.

Bu hizmetler bir IIS Web Sunucusu'ndan sunulduğundan, Kök Sitedeki Bağlamaları denetlemek sorunu çözdü. Birisi, Site Bağlamaları'nı üst üste bindirdi, üst üste binen kuralları tanımladı ve hizmetleri bozdu.

Doğru Bağlamaları düzeltmek benim durumumda sorunu çözdü ve ben Web.Config yapılandırmak zorunda değildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.