2008-11-21 33 views
19

Tôi đang thử nghiệm với Dịch vụ WCF và đã gặp phải vấn đề khi truyền Giao diện.Truyền Giao diện trong Dịch vụ WCF?

này hoạt động:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    string GetString(); 
} 

nhưng điều này không:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Khi tôi cố gắng biên dịch cho khách hàng nó không thành công trên phương pháp GetInterface. Tôi nhận được một ngoại lệ nói rằng nó không thể chuyển đổi Object thành IDevice.

Về phía client, lớp IHomeService thực hiện chính xác GetString bằng một chuỗi vì nó là returntype, nhưng GetInterface có một kiểu lại đối tượng. Tại sao nó không phải là IDevice?

Trả lời

20

Bạn cần phải nói cho các serializer WCF mà lớp sử dụng để serialize giao diện

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Tôi rất tiếc, nhưng tôi không nghĩ rằng tôi hiểu. Giả sử tôi muốn phương thức GetInterface trả về hai lớp khác nhau, SimpleDevice và AdvancedDevice, cả hai đều triển khai giao diện IDevice. Tôi có nên đặt ServiceKnownType cho cả hai loại không? –

+1

Khi deserializing, làm thế nào để WCF biết những gì thực hiện loại IHomeService để sử dụng? – Will

+1

Vâng, tôi nghĩ bạn đã hiểu. Bạn đang nói với WCF các loại có thể thực hiện giao diện. Bạn có thể vượt qua bất kỳ loại nào thông qua, miễn là WCF biết rằng các kiểu đã biết này thực hiện giao diện và có thể tuần tự hóa được. –

9

Cảm ơn, nó hoạt động khi tôi thay đổi nó như thế này:

[ServiceContract] 
[ServiceKnownType(typeof(PhotoCamera))] 
[ServiceKnownType(typeof(TemperatureSensor))] 
[ServiceKnownType(typeof(DeviceBase))] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Tôi cũng nhận được sự giúp đỡ từ này site: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

+0

Cảm ơn ví dụ đó! –

+1

Liên kết hiện là 404, nhưng một số công cụ tìm kiếm đã lưu trong bộ nhớ cache – noonand

+0

Frode: Bạn có nghĩ rằng @Brian thực sự đã trả lời câu hỏi của bạn không? –

1

Ban đầu tôi đã cố chuyển giao diện cho một phương thức WCF nhưng không thể lấy mã để làm việc bằng cách sử dụng các câu trả lời được cung cấp trên luồng này. Cuối cùng, tôi đã tái cấu trúc mã của mình và chuyển một lớp trừu tượng sang phương thức chứ không phải là một giao diện. Tôi đã làm việc này bằng cách sử dụng thuộc tính KnownType trên lớp cơ sở, ví dụ:

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData 
Các vấn đề liên quan