2009-05-16 38 views
33

Tôi đang cố triển khai dịch vụ WCF cho máy chủ của mình, được lưu trữ trong IIS. Đương nhiên nó hoạt động trên máy tính của tôi :)Cách khắc phục "không thể tìm thấy địa chỉ cơ sở khớp với lược đồ http" ... trong WCF

Nhưng khi tôi triển khai nó, tôi nhận được lỗi sau:

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.

Googling về điều này, tôi thấy rằng tôi có phải đặt một yếu tố serviceHostingEnvironment vào web.config file:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Nhưng một khi tôi đã làm điều này, tôi nhận được như sau:

Could not find a base address that matches scheme http for the endpoint with binding BasicHttpBinding. Registered base address schemes are [https].

Có vẻ như nó không biết địa chỉ cơ sở là gì, nhưng làm cách nào để xác định địa chỉ cơ sở? Đây là phần có liên quan của tệp web.config của tôi:

<system.serviceModel> 
    <serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
     <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfPortalBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IWcfPortal" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
       receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       openTimeout="00:10:00" closeTimeout="00:10:00"> 
     <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" 
       maxStringContentLength="2147483647"/> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal"> 
     <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal" 
     bindingConfiguration="BasicHttpBinding_IWcfPortal"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
</system.serviceModel> 

Ai có thể làm sáng tỏ những gì đang diễn ra và cách khắc phục sự cố?

+0

hey craig, bạn đã khắc phục vấn đề này chưa? Xin vui lòng cho tôi ... Tôi đang đối mặt với cùng một vấn đề: ( – Lamps

+0

giải pháp cuối cùng về nó? – Kiquenet

Trả lời

4

Mọi cơ hội IIS của bạn được định cấu hình để yêu cầu SSL trên các kết nối đến trang web/ứng dụng của bạn?

+0

Tôi nhận được lỗi này, @tomasr và IIS được cấu hình để yêu cầu SSL. Đây có phải là vấn đề không? Có cách nào không? – StatsStudent

0

Nếu nó được lưu trữ trong IIS, không cần phải chỉ định địa chỉ cơ sở, nó sẽ là địa chỉ của thư mục ảo.

+0

sau đó làm thế nào để giải quyết vấn đề của OP ??! –

0

Có một cách để giải quyết điều này khá dễ dàng với các phần cấu hình bên ngoài và một bước triển khai bổ sung làm giảm tệp .config cụ thể bên ngoài triển khai vào vị trí đã biết. Chúng tôi thường sử dụng giải pháp này để xử lý các cấu hình máy chủ khác nhau cho các môi trường triển khai khác nhau của chúng tôi (dàn dựng, QA, sản xuất, v.v.) với "hộp dev" của chúng tôi làm mặc định nếu không có bản sao đặc biệt nào xảy ra.

0

Xác nhận sửa chữa của tôi:

Trong file web.config của bạn, bạn nên cấu hình nó để tìm kiếm như vậy:

<system.serviceModel > 
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" /> 
    ... 

Sau đó, xây dựng một cấu trúc thư mục đó trông như thế này:

/web.config 
/Configurations/ServiceHosting.config 
/Configurations/Deploy/ServiceHosting.config 

Dịch vụ cơ sởHosting.config phải giống như sau:

<?xml version="1.0"?> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

trong khi một trong/Triển khai trông như thế này:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
     <add prefix="http://myappname.web707.discountasp.net"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Hơn thế nữa, bạn cần phải thêm một bước triển khai bằng tay hoặc tự động để sao chép các tập tin từ/Triển khai cao hơn một trong/Configurations. Điều này làm việc cực kỳ tốt cho địa chỉ dịch vụ và chuỗi kết nối, và tiết kiệm công sức làm cách giải quyết khác.

Nếu bạn không thích cách tiếp cận này (quy mô tốt cho các trang trại, nhưng yếu hơn trên một máy), bạn có thể xem xét thêm tệp web.config một cấp từ triển khai dịch vụ trên máy của máy chủ và đặt serviceHostingNnvironment node ở đó. Nó nên thác cho bạn.

4

Nếu bạn muốn sử dụng baseAddressPrefixFilters trong web.config, bạn cũng phải thiết lập IIS (6). Điều này đã giúp tôi:

1/Trong IIS tìm thấy trang web của bạn. 2/Thuộc tính/Trang web (tab)/Địa chỉ IP -> Nút nâng cao 3/Thêm tiêu đề máy chủ mới trên cùng một cổng mà bạn sẽ sử dụng trong web.config.

37

Thử thay đổi chế độ bảo mật từ "Giao thông" thành "Không".

 <!-- Transport security mode requires IIS to have a 
      certificate configured for SSL. See readme for 
      more information on how to set this up. --> 
     <security mode="None"> 
+0

Rất tốt - Tôi đã thay đổi điểm cuối từ https thành http để gỡ lỗi cục bộ và quên thay đổi chế độ bảo mật = "Giao thông vận tải" sang chế độ bảo mật = "Không" . Đã sửa. – atconway

4

Tôi phải làm hai việc với cấu hình IIS của trang web/ứng dụng. Vấn đề của tôi đã phải làm với nhận net.tcp làm việc trong một IIS Web Site App:

Đầu tiên:

  1. Nhấp chuột phải vào tên IIS App.
  2. Quản lý trang web
  3. Advanced Settings
  4. Set Bật giao thức là "http, net.tcp"

Thứ hai:

  1. Dưới menu Actions ở phía bên phải của Người quản lý, nhấp vào Bindings ...
  2. Nhấp vào Thêm
  3. Thay đổi loại thành "net.tcp"
  4. Set ràng buộc thông tin cho {số cổng mở}: *
  5. OK
2

Chỉ có địa chỉ cơ sở đầu tiên trong danh sách sẽ được thực hiện trên (đến từ IIS). Bạn không thể có nhiều địa chỉ cơ sở cho mỗi lược đồ trước .NET4.

1

Giải pháp là xác định ràng buộc tùy chỉnh bên trong tệp Web.Config của bạn và đặt chế độ bảo mật thành "Giao thông". Sau đó, bạn chỉ cần sử dụng thuộc tính bindingConfiguration bên trong định nghĩa điểm cuối của bạn để trỏ tới ràng buộc tùy chỉnh của bạn.

Xem tại đây: Scott's Blog: WCF Bindings Needed For HTTPS

Các vấn đề liên quan