2009-03-11 23 views
9

Chúng tôi có một dịch vụ WCF được lưu trữ trên ServerA là một máy chủ có truy cập Internet không trực tiếp và có địa chỉ IP không thể định tuyến Internet.WCF, Siêu dữ liệu và BIGIP - Tôi có thể buộc url chính xác cho các mục WSDL không?

Dịch vụ này được BIGIP quản lý, xử lý mã hóa SSL và giải mã và chuyển tiếp yêu cầu chưa được mã hóa tới ServerA (tại thời điểm KHÔNG thực sự thực hiện bất kỳ cân bằng tải nào, nhưng có khả năng sẽ được thêm vào trong tương lai) Hải cảng.

Điều đó có nghĩa là khách hàng của chúng tôi sẽ gọi dịch vụ qua số https://www.OurDomain.com/ServiceUrl và sẽ đến dịch vụ của chúng tôi theo số http://SeverA:85/ServiceUrl thông qua thiết bị BIGIP;

Khi chúng tôi duyệt đến WSDL được công bố trên https://www.OurDomain.com/ServiceUrl tất cả các địa chỉ chứa trong WSDL được dựa trên địa chỉ http://SeverA:85/ServiceUrl cơ sở

Chúng tôi đã tìm ra rằng chúng ta có thể sử dụng các tiêu đề chủ setting để thiết lập tên miền, nhưng vấn đề của chúng tôi là trong khi điều này sẽ phân loại tên miền, chúng tôi vẫn sẽ sử dụng sơ đồ sai - nó sẽ sử dụng http://www.OurDomain.com/ServiceUrl trong khi chúng tôi cần nó là Https. Ngoài ra - vì chúng tôi có các dịch vụ khác (dựa trên asmx) được lưu trữ trên máy chủ đó, chúng tôi đã gặp một số vấn đề khi đặt tiêu đề máy chủ và vì vậy chúng tôi nghĩ rằng chúng tôi có thể tạo ra một trang web khác trên máy chủ (sử dụng cổng 82)) và đặt tiêu đề máy chủ trên đó; bây giờ, trên đầu trang của vấn đề http/https, chúng tôi gặp vấn đề khi WSDL chứa số cổng trong tất cả các url, nơi BigIP hoạt động trên cổng 443 (đối với SSL)

Có giải pháp linh hoạt hơn Tiêu đề? Lý tưởng nhất là chúng ta cần duy trì sự linh hoạt và dễ dàng hỗ trợ.

Nhờ sự giúp đỡ ...

+0

Yossi, có bạn có lẽ đã nhận được một câu trả lời cho điều này từ đâu đó khác? - (John Saunders, người đã làm bài tập về nhà ở Oslo gần đây). –

Trả lời

6

Đây thực chất là vấn đề đa phần liên quan đến một số giải pháp rời rạc để cung cấp câu trả lời đầy đủ. Về cơ bản có 3 vấn đề với việc ngồi sau F5.

  1. Tên máy chủ lưu trữ điểm cuối dịch vụ được quảng cáo.
  2. Tên máy chủ của các liên kết đến xsd: các lược đồ được nhập khẩu mô tả hợp đồng dữ liệu
  3. sự cố http/https mà bạn mô tả.

Thay đổi tiêu đề máy chủ, vì bạn đã tìm thấy giải quyết 1 và 2 (bạn có thể tiếp cận cách này khác với tiêu đề máy chủ, nhưng không cần phải đi vào đó). Số 3 phức tạp hơn một chút và yêu cầu nhiều mã hơn (quá nhiều để thoát ra ở đây).

Câu trả lời ngắn gọn là bạn cần viết một ContractBehavior triển khai cả IContractBehavior và IWsdlExportExtension.

Bit quan trọng bạn cần triển khai là IWsdlExportExtension.ExportEndpoint. Trong phương thức này, bạn cần phải lặp qua tất cả các phần mở rộng WsdlPort, và khi bạn tìm thấy một phần mở rộng có kiểu SoapAddressBinding, bạn cần phải thay thế thuộc tính SoapAddressBinding.Location bằng một Uri mới có chứa bộ định danh giao thức https. Bạn cũng cần phải làm các bit tương tự cho các địa chỉ nhập khẩu xsd và các liên kết lược đồ.

Nếu dịch vụ của bạn cũng đang sử dụng WS-Addressing Bạn sau đó cần phải làm điều gì đó tương tự để xử lý các địa chỉ bổ sung mà nó ghi vào wsdl.

Tôi dựa trên mã tôi đã kết thúc bằng văn bản về dự án WsdlExtras có sẵn trên CodePlex (http://www.codeplex.com/WCFExtras/). Phương thức được sử dụng trong WsdlExtras cung cấp một cơ sở tuyệt vời cho bất kỳ bit phụ nào mà bạn có thể cần thêm vào nó (Từ bộ nhớ tôi không nghĩ rằng nó xử lý các bit WS-Addressing). Bit bạn muốn xem là "Ghi đè URL vị trí địa chỉ SOAP".

+0

Cảm ơn Mark, đây là những gì chúng tôi đã làm, nhưng tôi không chắc liệu giải pháp của tôi có đủ hay không (nghĩ là vậy), sẽ thực sự quan tâm đến việc so sánh nó với bạn, hy vọng đôi khi trong tuần này:) –

0

Nếu bạn đang thêm SSL trên đầu trang của dịch vụ hiện có, nó có lẽ sẽ còn ảnh hưởng đến chế độ bảo mật ràng buộc đối với WCF client, mà bạn có thể dễ dàng ghi đè.

Đối với WSDL, tại sao bạn không tải xuống tệp, thay đổi URL thành bất kỳ thứ gì bạn muốn và xuất bản chúng theo cách thủ công dưới dạng tệp?

0

Tôi nhận được mẹo tuyệt vời để đặt thuộc tính địa chỉ trên điểm cuối tới url bạn muốn hiển thị trong WSDL và sau đó thêm thuộc tính listenUri vào điểm cuối với Uri thực để nghe sẽ thực hiện thủ thuật.

URL trong trang kiểm tra không bị ảnh hưởng (tức là nó vẫn sẽ hiển thị các địa chỉ quy định trong ListenUri) nhưng trong WSDL đúng Uri sẽ được thiết lập (một trong những quy định tại địa chỉ.

Hầu hết mặc dù vậy, khi tôi thử điều này ngay sau khi tôi đăng câu hỏi, tôi không thể làm cho nó hoạt động trong IIS, chỉ khi tự lưu trữ trong một ứng dụng giao diện điều khiển, kiểm tra bản thân hôm nay tôi thấy nó thực sự hoạt động; không chắc chắn lý do tại sao nó không hoạt động cho tôi trước đây;

Những gì chúng tôi đã thực hiện trong thời gian có nghĩa là buid hành vi tùy chỉnh đơn giản đã thay đổi mô tả dịch vụ đưa địa chỉ được yêu cầu trong WSDL từ cấu hình; iously nếu có được xây dựng trong hỗ trợ cho rằng nó tốt hơn nhiều, vì vậy tôi sẽ hopfully có được một số thời gian vào tuần tới để nhìn vào điều này hơn nữa.

0

Để 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: // .. ...

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"> 
1

Cảm ơn Mark Allanson, tôi đã chính xác cùng một kịch bản như yossi dahan, tệp WCFExtras.dll đã làm việc cho tôi,

bước1. tải xuống WCFExtras.dll (http://www.codeplex.com/WCFExtras/).
bước2. thêm tham chiếu của nó vào dự án của bạn.
bước3. không lãng phí thời gian của bạn bằng cách viết bất kỳ mã nào như được đề xuất trong ứng dụng máy chủ mẫu.
bước4. mở web.config và đưa vào mã bên dưới:

<system.net> 
    <settings> 
     <httpWebRequest useUnsafeHeaderParsing="true" /> 
    </settings> 
    </system.net> 


<system.serviceModel> 
<services> 
    <service behaviorConfiguration="ServiceBehaviorName" name="ServiceName"> 
    <endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="ServiceEndpointBehaviorName"> 
     <wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehaviorName"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <!-- Declare that we have an extension called WSDL Extras--> 
    <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
</extensions> 
     </system.serviceModel> 


step5. cũng cần lưu ý rằng nếu bạn thêm tham chiếu bằng URL này "https://sslLoadBalancer/ServiceName.svc" thì nó sẽ không hoạt động, luôn nhớ thêm tham chiếu là: "https://sslLoadBalancer/ServiceName.svc?wsdl" theo cách này bạn sẽ có thể thêm tham chiếu đến ứng dụng của mình.

Thats nó ... nếu vẫn không hoạt động sau đó cho tôi biết, tôi sẽ dán file web.config đầy đủ ..

Cảm ơn

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