Tôi muốn biết cách định cấu hình các loại đã biết trong WCF. Ví dụ: tôi có một lớp học Người và một lớp học Nhân viên. Lớp học Nhân viên là một lớp con của lớp học Người. Cả hai lớp được đánh dấu bằng thuộc tính [DataContract]
.WCF: Định cấu hình các loại đã biết
Tôi không muốn mã hóa kiểu đã biết của một lớp, như đặt [ServiceKnownType(typeof(Employee))]
ở lớp Person để WCF biết rằng Employee là một lớp con của Person.
Bây giờ, tôi thêm vào App.config cấu hình XML sau của máy chủ:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Person, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null">
<knownType type="Employee, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
<system.serviceModel>
.......
</system.serviceModel>
</configuration>
tôi biên soạn nó, chạy máy chủ, bổ sung thêm một tài liệu tham khảo dịch vụ tại các khách hàng và thêm vào một số mã và chạy client. Nhưng một lỗi xảy ra:
Các định dạng ném một ngoại lệ khi cố gắng để deserialize thông điệp: Có lỗi trong khi cố gắng tham số deserialize
http://www.herbertsabanal.net:person
. Thông điệp InnerException là 'Lỗi trong dòng 1 vị trí 247. Yếu tố'http://www.herbertsabanal.net:person'
chứa dữ liệu của hợp đồng dữ liệu'http://www.herbertsabanal.net/Data:Employee'
. Trình gỡ bỏ không có số kiến thức về bất kỳ loại nào ánh xạ tới hợp đồng này. Thêm kiểu tương ứng với 'nhân viên' cho danh sách các loại được biết đến - ví dụ, bằng cách sử dụng thuộc tính KnownTypeAttribute hoặc bằng cách thêm nó vào danh sách các tiếng loại truyền cho DataContractSerializer '.. Vui lòng xem InnerException để biết thêm chi tiết.
Dưới đây là những hợp đồng dữ liệu:
[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Person")]
class Person
{
string _name;
int _age;
[DataMember(Name="Name", Order=0)]
public string Name
{
get { return _name; }
set { _name = value; }
}
[DataMember(Name="Age", Order=1)]
public int Age
{
get { return _age; }
set { _age = value; }
}
}
[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Employee")]
class Employee : Person
{
string _id;
[DataMember]
public string ID
{
get { return _id; }
set { _id = value; }
}
}
Btw, tôi không sử dụng thư viện lớp (thư viện lớp WCF hoặc thư viện lớp phi WCF) cho dịch vụ của tôi. Tôi chỉ đơn giản là mã hóa nó trong dự án máy chủ.
Tôi đoán rằng phải có sự cố tại tệp cấu hình (vui lòng xem tệp cấu hình ở trên). Hoặc tôi phải thiếu một cái gì đó. Bất kỳ trợ giúp sẽ được khá nhiều đánh giá cao.
tôi nghi ngờ rằng cấu hình chỉ hoạt động nếu sử dụng thư viện của bên thứ ba, tham chiếu đến dịch vụ. Tôi sẽ thử nó và tôi sẽ lấy lại cho câu hỏi này nếu tôi tìm thấy một số câu trả lời. – jerbersoft