2010-02-04 29 views
10

Đây là dịch vụ lưu trữ IIS .svc với ssl và tư cách thành viên.wcf Dịch vụ không thể được kích hoạt

báo cáo của tôi WCF client:

System.ServiceModel.ServiceActivationException was unhandled 
    Message="The requested service, 'https://www.greenjump.nl/WebServices/OrderService.svc' could not be activated. See the server's diagnostic trace logs for more information." 
    Source="mscorlib" 

Trên máy chủ tôi nhận được: System.ArgumentException Bộ sưu tập này đã có chứa một địa chỉ với chương trình http. Có thể có tối đa một địa chỉ cho mỗi lược đồ trong bộ sưu tập này. Tên thông số: mục

Điều lạ lùng chỉ xảy ra trên máy chủ sản xuất, cùng mã và cấu hình trên máy chủ phát triển cục bộ hoạt động tốt. tôi chỉ thay đổi địa chỉ endpoint và từ tên máy tính để www.webdomain.com

nhiều máy chủ trace

<ExceptionType> 
    System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
</ExceptionType> 
<Message> 
    This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. 
    Parameter name: item 
</Message> 
<StackTrace> 
    at System.ServiceModel.UriSchemeKeyedCollection.InsertItem(Int32 index, Uri item) 
    at System.Collections.Generic.SynchronizedCollection`1.Add(T item) 
    at System.ServiceModel.UriSchemeKeyedCollection..ctor(Uri[] addresses) 
    at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses) 
    at SharpShop.Web.StructureMap.StructureMapServiceHost..ctor(Type serviceType, Uri[] baseAddresses) 
    at SharpShop.Web.StructureMap.StructureMapServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath) 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state) 
    at System.ServiceModel.PartialTrustHelpers.PartialTrustInvoke(ContextCallback callback, Object state) 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(Object state) 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object state) 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
    at System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 

config:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttps"> 
      <readerQuotas maxStringContentLength="128000"/> 
      <security mode="TransportWithMessageCredential"> 
      <transport clientCredentialType="None"/> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" > 
     <baseAddressPrefixFilters> 
     <add prefix="https://www.greenjump.nl"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WsHttpWithAuthBehavior"> 
      <serviceMetadata httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" 
           roleProviderName="AspNetSqlRoleProvider"/> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
       membershipProviderName="AspNetSqlMembershipProvider" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="WsHttpWithAuthBehavior" name="SharpShop.Services.OrderService"> 
     <endpoint address="https://www.greenjump.nl/WebServices/OrderService.svc" 
        binding="wsHttpBinding" 
        bindingConfiguration="wsHttps" 
        contract="SharpShop.Services.IOrderService"> 
      <identity> 
      <dns value="www.greenjump.nl" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
+0

chúng ta có thể thấy cấu hình? –

+0

http://stackoverflow.com/questions/10902643/cant-activate-wcf-service/36487750#36487750 –

+0

Chia sẻ các bước bên dưới url: http://stackoverflow.com/questions/10902643/cant-activate-wcf -Service/36487750 # 36487750 –

Trả lời

1

Vấn đề là do IIS xử lý nhiều tiêu đề chủ. Giống như blowdart đã nói ở đây. lỗi: Bộ sưu tập này đã chứa địa chỉ với lược đồ http.

và có phần phức tạp hơn ở đây http://forums.silverlight.net/forums/p/12883/274592.aspx

sử dụng baseAddresses đầu tiên [0] không phải là một lựa chọn cho tôi vì baseAddresses tôi đã http://localhost/WebServices/OrderService.svc http://www.greenjump.nl/WebServices/OrderService.svc https://vps2051.xlshosting.net/WebServices/OrderService.svc theo thứ tự này tất nhiên tôi có thể làm [1] nhưng tôi không thích sự phụ thuộc cấu hình này.

Có vẻ như vấn đề của tôi là hơi phức tạp hơn do sự https ràng buộc, đây là ServiceHostFactory tôi đến với:

public class MyServiceHostFactory : ServiceHostFactory 
    { 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      Uri webServiceAddress = baseAddresses[0]; //default to first 

      if (HttpContext.Current != null) //this only works when aspNetCompatibilityEnabled=true 
      { 
       string host = HttpContext.Current.Request.Url.Host; 
       var goodAddress = baseAddresses.FirstOrDefault(a => a.Host == host);//try to find address with same hostname as request 
       if(goodAddress!=null) 
       { 
        webServiceAddress = goodAddress; 
       } 
       Type[] sslServices = { typeof(OrderService) };//add all https services here 
       if (sslServices.Any(s => s == serviceType)) 
       { 
        UriBuilder builder = new UriBuilder(webServiceAddress); 
        builder.Scheme = "https"; 
        builder.Port = 443; //fails if you use another port 
        webServiceAddress = builder.Uri; 
       } 
      } 
      return new ServiceHost(serviceType, webServiceAddress); 
     } 
    } 

Tuy nhiên điều này cảm thấy hacky, và cần được giải quyết bằng cách microsoft.

+0

@Medo Bạn đã thử thêm cổng vào điểm cuối và tiền tố cơ sở chưa? Đó là một giải pháp để bạn không cần phải làm nhà máy tùy chỉnh này. –

1

Hai đoán: bạn đã có nhiều < địa chỉ điểm cuối = "" trong đó đâu đó.

Chúng có thể không có cùng giá trị nhưng chúng có thể phân giải cùng tên.

Hoặc vì có vẻ như bạn đang sử dụng https: //, bạn có sử dụng http trên máy dev và https trên máy trực tiếp không?

Nếu có, bạn có các địa chỉ điểm cuối riêng biệt cho cả hai không? Về lý thuyết bạn không nên làm điều này - bạn cho phép bảo mật giao thông trên địa chỉ cơ sở http, điều này sẽ ngăn không cho nó có thể được gọi trên bất kỳ điều gì khác ngoài https.

Kỹ thuật http và https là cả hai lược đồ http.

+0

chỉ một điểm cuối, và trên máy de dev tôi cũng sử dụng https đã làm một giải pháp tìm kiếm chỉ để chắc chắn, không tìm thấy điểm cuối nào khác. Nó hoạt động trong devserver Tôi chỉ thay thế tên miền và vị trí điểm cuối trên sản xuất – Medo

+0

xem cấu hình - bạn đã thử xóa 'địa chỉ =' rõ ràng khỏi điểm cuối của dịch vụ chính chưa? Bạn không cần chỉ định địa chỉ cơ sở nếu dịch vụ sẽ 'bắt đầu' ở tệp .svc. –

0

Hãy thử thêm một tiền tố để máy chủ sản xuất của bạn trong ther cấu hình web:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="https://www.greenjump.nl:443" /> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

này sẽ được thêm vào <system.serviceModel>

Và điểm cuối của bạn sẽ giống như thế này:

<endpoint address="https://www.greenjump.nl:443/WebServices/OrderService.svc" 
       binding="wsHttpBinding" 
       bindingConfiguration="wsHttps" 
       contract="SharpShop.Services.IOrderService"> 

Nếu không bạn luôn có thể quá tải ServiceFactory như một trong những nhà bình luận khác đã đề xuất

8

Nếu bạn đang lưu trữ trong IIS, bạn không cần phần địa chỉ cơ sở - vì cấu hình trang của IIS cung cấp nó - vì vậy hãy loại bỏ phần đó.

Có một "sự cố" khi IIS được định cấu hình cho nhiều tiêu đề máy chủ, trong trường hợp này, bạn cần sử dụng một nhà máy tùy chỉnh để xóa tất cả các địa chỉ khỏi một địa chỉ bạn muốn. Một ví dụ đơn giản là

namespace Example 
{ 
    public class GenericServiceHostFactory : ServiceHostFactory 
    { 
     protected override ServiceHost CreateServiceHost(Type serviceType, 
                 Uri[] baseAddresses) 
     { 
      //return the first... 
      return new ServiceHost(serviceType, baseAddresses[0]); 
     } 
    } 
} 

Sau đó, bạn sẽ sử dụng trong tập tin .svc bạn

<%@ ServiceHost 
    Service="MyImplementationClass" 
    Factory="Example.GenericServiceHostFactory" 
%> 
+0

cảm ơn tôi đã làm việc theo hướng đó sẽ đăng kết quả của tôi. – Medo

0

tôi đã có thể giải quyết vấn đề bằng cách làm theo các bước dưới đây sử dụng Visual Studio 2013:

  1. Đến thư mục dự án của bạn, nơi bạn có * .svc tập tin của bạn

  2. Right Click * .svc tập tin -> View trong trình duyệt

  3. Validate nếu bạn có thể duyệt qua các dịch vụ

  4. đến proj của bạn ect thư mục nơi bạn có tệp app.config hoặc nơi bạn muốn sử dụng dịch vụ.

  5. dự án Nhấp chuột phải -> Add -> Dịch vụ Reference

  6. Nhấn Khám phá -> Trong Dịch vụ Chọn dịch vụ -> Đưa tên mong muốn để tham khảo dịch vụ của bạn -> Click OK

  7. Nó sẽ tạo ra "ServiceReference1" trong thư mục "Tài liệu tham khảo dịch vụ" & tự động tạo/cập nhật app.config tập tin enter image description here

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