2008-08-08 40 views
7

Tôi chỉ tham gia vào việc tạo một số dịch vụ WCF, nhưng tôi có yêu cầu làm cho chúng tương thích ngược với các ứng dụng khách cũ (.NET 1.1 và 2.0).WCF Service - Vấn đề tương thích ngược

Tôi đã quản lý để các dịch vụ chạy đúng cho các ứng dụng 3.0 và lớn hơn, nhưng khi tôi xuất bản dịch vụ bằng cách sử dụng điểm cuối cơ bảnHttpBinding (mà tôi tin là cần thiết cho tính tương thích tôi cần), dịch vụ sẽ tái cấu trúc chữ ký phương thức của tôi . ví dụ.

public bool MethodToReturnTrue(string seedValue); 

dường như các ứng dụng client như

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified); 

Tôi đã thử mọi tham số cấu hình tôi có thể nghĩ đến trong app.config để tự lưu trữ ứng dụng giao diện điều khiển của tôi, nhưng tôi dường như không thể để thực hiện chức năng này như mong đợi. Tôi cho rằng điều này có thể dẫn đến thực tế là sự mong đợi của tôi là thiếu sót, nhưng tôi sẽ ngạc nhiên rằng một dịch vụ WCF không có khả năng xử lý một kiểu trả về bool cho một máy khách cấp thấp.

Ứng dụng hiện tại của tôi.config trông giống như thế này.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService"> 
     <clear /> 
     <endpoint address="http://localhost:8080/CSMEX" binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
     <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors" > 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Bất cứ ai có thể tư vấn, vui lòng?

Trả lời

3

OK, chúng tôi cần giải quyết vấn đề này trong thời gian ngắn và vì vậy chúng tôi đã đưa ra ý tưởng về lớp tương thích "" hoặc tương thích.

Về mặt tinh thần, tất cả những gì chúng tôi đã làm đã được thêm dịch vụ web ASMX truyền thống vào dự án và gọi dịch vụ WCF từ đó bằng cách sử dụng các cuộc gọi WCF gốc. Sau đó, chúng tôi có thể trả lại các loại thích hợp trở lại ứng dụng của khách hàng mà không cần một số lượng đáng kể công việc tái thanh toán. Tôi biết đó là một giải pháp hacky, nhưng đó là lựa chọn tốt nhất mà chúng tôi có với một mã cơ sở di sản lớn như vậy. Và tiền thưởng thêm là nó thực sự hoạt động khá tốt. :)

3

Ah, điều này đang giết chết tôi! Tôi đã làm điều này tại nơi làm việc khoảng 3 tháng trước, và bây giờ tôi không thể nhớ tất cả các chi tiết.

Tôi nhớ, tuy nhiên, bạn cần basicHttpBinding và bạn không thể sử dụng trình nối tiếp mới (mặc định); bạn phải sử dụng XmlSerializer "cũ".

Thật không may, tôi không làm việc ở nơi tôi đã làm điều này nữa, vì vậy tôi không thể nhìn vào mã. Tôi sẽ gọi cho sếp của tôi và xem những gì tôi có thể đào lên.

0

Bạn phải sử dụng XmlSerializer. Ví dụ:

[ServiceContract(Namespace="CentreServiceNamespace")] 
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)] 
public interface ICentreService { 
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")] 
    bool MethodToReturnTrue(string seedValue); 
} 

Bạn phải tự đặt tên hành động hoạt động vì tự động tạo tên WCF được xây dựng khác nhau từ tên hành động ASMX (WCF bao gồm tên giao diện là tốt, ASMX không).

Mọi hợp đồng dữ liệu bạn sử dụng phải được trang trí với [XmlType] thay vì [DataContract].

Tệp cấu hình của bạn không cần phải thay đổi.

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