Để lớp dịch vụ của bạn thêm thuộc tính:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
Điều này cho phép các dịch vụ phải được giải quyết bởi các khách hàng như https: // ... nhưng dịch vụ được lưu trữ trên http : // ..... Xem this answer để biết cách tạo tiện ích mở rộng cho phép AddressFilterMode.Any được chỉ định thông qua cấu hình mà không yêu cầu thuộc tính mã.
Trong web.config của máy chủ dịch vụ, phần tử điểm cuối phải có URL tuyệt đối trong thuộc tính địa chỉ là URL công khai sẽ được khách hàng sử dụng. Trong cùng phần tử điểm cuối, đặt thuộc tính listenUri thành URL tuyệt đối mà máy chủ dịch vụ đang nghe. Cách tôi xác định URI tuyệt đối mặc định mà máy chủ đang lắng nghe là thêm một tham chiếu dịch vụ vào một ứng dụng khách mà trỏ máy chủ vật lý nơi dịch vụ được lưu trữ. Web.config của máy khách sẽ có địa chỉ cho dịch vụ. Sau đó tôi sao chép nó vào thuộc tính listenUri trong web.config của máy chủ.
Trong cấu hình hành vi dịch vụ của bạn thêm các yếu tố serviceMetaData với thuộc tính httpGetEnabled = true
Vì vậy, bạn sẽ có một cái gì đó như:
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior
</serviceBehaviors>
...
<services>
<service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
<endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ... />
</service>
</services>
Tôi không chắc chắn nếu điều này làm việc với an ninh thông, an ninh giao thông . Đối với ứng dụng cụ thể này, các thông tin đăng nhập đã được thông qua như một phần của DataContract, vì vậy chúng tôi đã có chế độ bảo mật basicHttpBinding = none. Vì vận chuyển an toàn (với bộ cân bằng tải ssl) không có vấn đề bảo mật.
Cũng có thể để trống thuộc tính listenUri, tuy nhiên nó phải có mặt. Thật không may, có một lỗi trong WCF nơi địa chỉ cơ sở của các lược đồ được nhập trong WSDL có địa chỉ cơ sở listenUri chứ không phải địa chỉ cơ sở công khai (địa chỉ được cấu hình bằng thuộc tính địa chỉ của điểm cuối). Để giải quyết vấn đề đó, bạn cần phải tạo một triển khai IWsdlExportExtension để đưa trực tiếp các lược đồ đã nhập vào tài liệu WSDL và loại bỏ các nhập khẩu. Một ví dụ về điều này được cung cấp tại đây http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf.Ngoài ra bạn có thể có kế thừa dụ lớp từ BehaviorExtensionElement và hoàn thành hai phương pháp mới với:
Public Overrides ReadOnly Property BehaviorType() As System.Type
Get
Return GetType(InlineXsdInWsdlBehavior)
End Get
End Property
Protected Overrides Function CreateBehavior() As Object
Return New InlineXsdInWsdlBehavior()
End Function
Điều này sẽ cho phép bạn thêm một hành vi mở rộng trong file config và thêm hành vi sử dụng cấu hình thay vì phải tạo một nhà máy dịch vụ.
dưới các yếu tố cấu hình System.ServiceModel thêm:
<endpointBehaviors>
<behavior name="SSLLoadBalancerBehavior">
<flattenXsdImports/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
<add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
Và sau đó tham khảo các hành vi đầu cuối mới trong cấu hình thiết bị đầu cuối của bạn bằng cách sử dụng thuộc tính behaviorConfiguration
<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
nội dung đó dường như đã chuyển đến http: //msdn.microsoft.com/en-us/magazine/cc163412.aspx. – JohnW