Lỗi khởi động dịch vụ WCF Bộ sưu tập này đã chứa một địa chỉ với lược đồ http.


182

Tôi đã xây dựng một ứng dụng web có chứa hợp đồng dịch vụ WCF và điều khiển Silverlight thực hiện các cuộc gọi đến dịch vụ WCF đó. Trên máy chủ phát triển và thử nghiệm của tôi, nó hoạt động rất tốt.

Khi tôi triển khai đến máy chủ trực tiếp của chúng tôi và chạy ứng dụng, tôi gặp một loại ngoại lệ System.ServiceModel.ServiceActivationExceptioncho biết dịch vụ không thể được kích hoạt do ngoại lệ trong quá trình biên dịch. Ngoại lệ là:

Bộ sưu tập này đã chứa một địa chỉ với sơ đồ http. Có thể có nhiều nhất một địa chỉ cho mỗi lược đồ trong bộ sưu tập này.

Tôi đọc rằng ngoại lệ này có thể bị ném nếu trang web có nhiều tiêu đề máy chủ, điều này đúng trên máy chủ trực tiếp của chúng tôi. Rõ ràng các dịch vụ WCF được lưu trữ trong IIS chỉ có thể có một địa chỉ cơ sở. Làm thế nào tôi có thể khắc phục vấn đề này?

Câu trả lời:


166

Trong .Net 4, bạn có thể sử dụng multipleSiteBindingsEnabledtùy chọn:

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

Sau đó, bạn sẽ không phải chỉ định từng địa chỉ.

http://msdn.microsoft.com/en-us/l Library / system.servicemodel.servicehostingen Môi trường.multiplesitebindingsenables.aspx


Có, nhưng điều này chỉ hoạt động với .NET 4.0 trở lên. Không thể sử dụng điều này với các trang web .NET 2.0 / 3.0 / 3.5.
Bytemaster

2
Lưu ý - có một lỗi đánh máy ở đây - không có đóng>, vì vậy nếu bạn sao chép và dán, bạn sẽ gặp sự cố
sydneyos

2
Nó không hoạt động cho câu hỏi này: "Chức năng này chỉ khả dụng khi sử dụng giao thức HTTP."
George Tsiokos

146

Tóm lược,

Giải pháp mã: Tại đây

Giải pháp cấu hình: Tại đây

Với sự giúp đỡ của Mike Chaliy , tôi đã tìm thấy một số giải pháp về cách thực hiện điều này thông qua mã. Bởi vì vấn đề này sẽ ảnh hưởng đến khá nhiều tất cả các dự án chúng tôi triển khai đến một môi trường sống mà tôi đã đưa ra cho một giải pháp cấu hình thuần túy. Cuối cùng tôi đã tìm thấy một chi tiết làm thế nào để làm điều đó trong .net 3.0 và .net 3.5.

Lấy từ trang web, bên dưới là một ví dụ về cách thay đổi cấu hình web ứng dụng của bạn:

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

Trong ví dụ trên, net.tcp: //payroll.myorg.com: 8000 và http://shipping.myorg.com:9000 là các địa chỉ cơ sở duy nhất, cho các chương trình tương ứng của chúng, sẽ được phép đi qua. BaseAddressPrefixFilter không hỗ trợ bất kỳ ký tự đại diện nào.

Các cơ sở địa chỉ do IIS cung cấp có thể có các địa chỉ bị ràng buộc với các lược đồ khác không có trong danh sách baseAddressPrefixFilter. Những địa chỉ này sẽ không được lọc ra.

Giải pháp Dns (chưa được kiểm tra): Tôi nghĩ rằng nếu bạn đã tạo một mục nhập dns mới cụ thể cho ứng dụng web của mình, đã thêm một trang web mới và cung cấp cho nó một tiêu đề máy chủ phù hợp với mục nhập dns, bạn sẽ giảm thiểu vấn đề này hoàn toàn, và sẽ không phải viết mã tùy chỉnh hoặc thêm tiền tố vào tệp web.config.


2
Thêm bộ lọc tiền tố địa chỉ cơ sở vào web.config hoạt động hoàn hảo. Cảm ơn Jeremy!
Mike737

2
Tôi không thể nghĩ ra bất kỳ lý do nào khiến người ta muốn hạn chế như vậy, ít hơn nhiều so với cài đặt mặc định ...
pbz

42
Tôi bắt đầu nghĩ xấu về WCF kết hợp với ASP.net và các dịch vụ web được truy cập thông qua JavaScript. Tôi đã có ít vấn đề hơn với các dịch vụ ASMX cũ đơn giản ...
Juri

Ok, nếu bạn có một trang web có sự kết hợp của các ứng dụng .net 4 và .net 2 đang chạy bên dưới nó. Cơ sở của ứng dụng là .net4 và có một số ứng dụng yêu cầu .net2. Bạn có sử dụng <servicehostingEn Môi trường nhiềuSiteBindingsEnables = "true"> trong tất cả các tệp .net4 và tiền tố trong các ứng dụng .net 2 không?
Travis

59

Bạn có thấy điều này không - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-al yet.aspx

Bạn có thể khắc phục lỗi này bằng cách thay đổi tệp web.config.

Với ASP.NET 4.0, hãy thêm các dòng sau vào web.config:

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

Với ASP.NET 2.0 / 3.0 / 3.5, hãy thêm các dòng sau vào web.config:

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

Cảm ơn. Tôi sẽ tiếp tục tìm kiếm để xem nếu có một giải pháp không mã. Một cái gì đó có thể được thực hiện trong cấu hình bởi vì điều này sẽ ảnh hưởng đến bất kỳ dự án nào chúng tôi làm, tôi hy vọng không phải viết mã tùy chỉnh.
Jeremy

16

Trong trường hợp nguyên nhân gốc rễ của vấn đề này là nhiều ràng buộc http được xác định tại trang web mẹ, tức là InetMgr-> Trang web-> Mysite-> property-> EditBindings. Tôi đã xóa một ràng buộc http không cần thiết và vấn đề đã được giải quyết.


1
Có Amar điều này rất hữu ích - trong trường hợp của tôi, đó là trang web KHÁC với nhiều ràng buộc đã phá vỡ nó. Có sẵn bên ngoài trên cùng một máy (nhưng có Tên máy chủ khác). Tương tự, nó có thể được sửa bằng cách thêm cài đặt multiSiteBindingsEnables nhưng sau đó web.config sẽ khác với tất cả các môi trường khác.
Bộ giải mã

2
Đó là một sự xấu hổ này là ở dưới cùng. Trong trường hợp của chúng tôi điều này đã sửa nó cho chúng tôi.
brendonparker

Nó giúp tôi nhân rộng lỗi trong môi trường phát triển. Tôi không thể chỉnh sửa các ràng buộc trang web trong cả môi trường chứng nhận và môi trường sống. Tôi đã thay đổi tệp máy chủ của mình để mô phỏng một tên miền và thêm các ràng buộc vào IIS cục bộ và bam!
MFedatto

8

Và trong trường hợp của tôi, nó thật đơn giản: Tôi đã sử dụng trình hướng dẫn 'Thêm dịch vụ WCF' trong Visual Studio, tự động tạo các phần tương ứng trong app.config. Sau đó tôi tiếp tục đọc Cách làm: Lưu trữ Dịch vụ WCF trong Ứng dụng được quản lý . Vấn đề là: Tôi không cần chỉ định url để chạy dịch vụ web.

Thay thế:

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

Với:

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

Và lỗi đã biến mất.

Ý tưởng chung: nếu bạn cung cấp địa chỉ cơ sở dưới dạng thông số chỉ định nó trong cấu hình, bạn sẽ gặp lỗi này. Rất có thể, đó không phải là cách duy nhất để nhận lỗi, bạn.


Giải quyết vấn đề của tôi.
QShengyao

2

Tôi đã có vấn đề này, và nguyên nhân là khá ngớ ngẩn. Tôi đã dùng thử bản demo của Microsoft liên quan đến việc chạy Servicehost từ w / trong dòng thực thi Dòng lệnh. Tôi đã làm theo hướng dẫn, bao gồm cả nơi nói để thêm Dịch vụ (và giao diện) phù hợp. Nhưng tôi đã nhận được lỗi trên.

Hóa ra khi tôi thêm lớp dịch vụ, VS sẽ tự động thêm cấu hình vào app.config. Và bản demo đã cố gắng thêm thông tin đó. Vì nó đã có trong cấu hình, tôi đã gỡ bỏ phần demo và nó đã hoạt động.


0

Tôi gặp lỗi tương tự trên Exchange Server 2010 cũ. Một dịch vụ (dịch vụ sao chép hộp thư Exchange) đã đưa ra lỗi trên và quá trình di chuyển không thể tiếp tục. Tìm kiếm thông qua internet, tôi đến bằng liên kết này trong đó nêu dưới đây:

Exchange GRE không mở được khi cài đặt lần đầu tiên hoặc nếu có bất kỳ thay đổi nào được thực hiện đối với máy chủ IIS. Không thành công với lỗi snap-in và khi bạn cố mở trang snap-in, nội dung sau sẽ được hiển thị:

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

Nguyên nhân : Lỗi này xảy ra do cổng http số 443 đã được sử dụng bởi một ứng dụng khác và máy chủ IIS không được cấu hình để xử lý nhiều ràng buộc cho cùng một cổng.

Giải pháp : Cấu hình máy chủ IIS để xử lý nhiều ràng buộc cổng. Liên hệ với nhà cung cấp (Microsoft) để cấu hình nó.

Vì các dịch vụ này được cung cấp từ Máy chủ Web IIS, việc kiểm tra các ràng buộc trên Trang web gốc đã khắc phục sự cố. Ai đó đã làm rối Bindings trang web, xác định các quy tắc chồng chéo lên nhau và làm rối tung các dịch vụ.

Sửa lỗi Bindings chính xác đã giải quyết vấn đề, trong trường hợp của tôi và tôi không phải định cấu hình Web.Config.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.