2013-06-19 34 views
11

Tôi đang làm việc trên ứng dụng khách-máy chủ (.NET 4 WPF, WCF) phải hỗ trợ tính tương thích ngược. Nói cách khác, các máy khách cũ nên tương thích với các máy chủ mới (và ngược lại) theo như hợp đồng vận hành và hợp đồng dữ liệu.WCF: Nhiều cấu hình ràng buộc cho một dịch vụ đơn lẻ

dịch vụ WCF của chúng tôi được tổ chức trong IIS, và họ được thiết lập để sử dụng basicHttpBinding:

<basicHttpBinding> 
    <binding name="basicHttpBinding_Configuration" maxBufferSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" /> 
     <security mode="None" /> 
    </binding> 
</basicHttpBinding> 

... 

<service behaviorConfiguration="SampleGateway.Data.DataAccessBehavior" 
    name="SampleGateway.Data.DataAccess"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_Configuration" 
     contract="Sample.Data.IDataAccess" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleGateway/SampleGateway.Data.DataAccess.svc" /> 
     </baseAddresses> 
    </host> 
</service> 

... 

<behavior name="SampleGateway.Data.DataAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" /> 
    <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
</behavior> 

Giả sử hợp đồng là khá cơ bản và trông giống như sau:

[ServiceContract] 
public interface IDataAccess 
{ 
    [OperationContract] 
    List<Data> GetData(List<int> ids, DateTime startDateTime, DateTime endDateTime); 
} 

Gần đây , Tôi phát hiện ra rằng chúng tôi có thể thay đổi mã hóa của mình từ XML thành binary. Kết hợp với IIS nén, điều này thực sự thúc đẩy hiệu suất của các phương pháp WCF của chúng tôi như GetData được liệt kê ở trên.

Thay đổi mã hóa này cũng yêu cầu thay đổi về ràng buộc WCF của máy khách và máy chủ, chuyển từ basicHttpBinding thành customBinding.

<customBinding > 
    <binding name="binaryHttpBinding_Configuration"> 
     <binaryMessageEncoding maxReadPoolSize="2147483647" maxSessionSize="2147483647" maxWritePoolSize="2147483647"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647"/> 
     </binaryMessageEncoding> 
     <httpTransport transferMode="Streamed" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="true"/> 
    </binding> 
</customBinding> 

... 

<service behaviorConfiguration="SampleGateway.Data.DataAccessBehavior" 
    name="SampleGateway.Data.DataAccess"> 
    <endpoint address="" binding="customBinding" bindingConfiguration="binaryHttpBinding_Configuration" 
     contract="CEMLink.Data.IDataAccess" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleGateway/SampleGateway.Data.DataAccess.svc" /> 
     </baseAddresses> 
    </host> 
</service> 

... 

Đây là vấn đề. Vì phần mềm của chúng tôi phải hỗ trợ khả năng tương thích ngược của máy khách/máy chủ, nếu một khách hàng cũ có số basicHttpBinding cũ cố gắng truy cập máy chủ với số customBinding mới, cuộc gọi sẽ không thành công với sự không khớp, ví dụ: "Content Type text/xml; charset=utf-8 was not supported by this service.... The client and service bindings may be mismatched"

Tôi có thể có hai cấu hình ràng buộc cho cùng một hợp đồng dịch vụ - một cơ bản và tùy chỉnh khác và cả hai đều trỏ đến cùng một giao diện? Làm thế nào tôi có thể làm việc xung quanh điều này?

Trả lời

9

Về cơ bản, bạn cần 2 điểm cuối cho cùng một dịch vụ được hiển thị ở các địa chỉ khác nhau và được căn chỉnh với các ràng buộc khác nhau. This có thể giúp bạn.

+0

Cảm ơn bạn đã làm rõ. Liên kết chính xác mô tả chính xác những gì tôi đang tìm kiếm. –

0

Bạn có thể có 2 liên kết khác nhau cho cùng một hợp đồng dịch vụ, nhưng bạn sẽ cần tạo các nút dịch vụ riêng trong cấu hình và bạn cũng sẽ cần xác định điểm cuối riêng biệt. Vì vậy, tạo một điểm cuối mới cho dịch vụ được định dạng nhị phân và có phiên bản mới của ứng dụng khách tham chiếu nó.

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