Tôi đã cố gắng sử dụng ứng dụng SilverLight để gọi dịch vụ WC.Net ASP.Net sẽ trả về Dictionary<string, object>
. Điều đó làm việc tốt khi các giá trị trong từ điển là các loại đơn giản như int
, string
hoặc Guid
.Dịch vụ WCF trả về một mảng từ điển <string, object>
Tuy nhiên, bây giờ tôi có một kịch bản mà tôi cần một trong các giá trị là một mảng Dictionary<string, object>
! Tất cả đều biên dịch tốt và chữ ký của dịch vụ không thay đổi nhưng cuộc gọi dịch vụ hiện không thành công.
Bất kỳ ý tưởng nào về cách khắc phục sự cố? Tôi đã cố gắng chú thích lớp dịch vụ và phương pháp của mình với thuộc tính KnownType
và ServiceKnownType
nhưng không hoạt động.
Dưới đây là một đoạn mã:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[OperationContract]
[ServiceKnownType(typeof(Dictionary<string, object>))]
public Dictionary<string, object> GetObject()
{
return new Dictionary<string, object>()
{
{ "pty1", 1 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
{ "pty4", new Dictionary<string, object>[]
{
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
}
,
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blahblah" },
}
}
}
};
}
}
Cảm ơn bạn đã trả lời của bạn. Tôi đã bật WCF truy tìm và, như nghi ngờ, có một vấn đề trong quá trình serialization. Sự cố không phải là sự tuần tự hóa Dictionary<string, object>
nhưng là một trong số Array
của Dictionary<string, object>
.
Đây là ngoại lệ được ghi bởi dịch vụ WCF.
Đã xảy ra lỗi khi cố gắng sắp xếp tham số: GetObjectResult. Thông điệp InnerException là 'Loại' System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = b77a5c561934e089], [System.Object, mscorlib, Phiên bản = 2.0. 0.0, Văn hóa = trung lập, PublicKeyToken = b77a5c561934e089]] [] 'với tên hợp đồng dữ liệu' ArrayOfArrayOfKeyValueOfstringanyType: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'không được mong đợi. Thêm bất kỳ loại nào không được biết đến tĩnh vào danh sách các kiểu đã biết - ví dụ, bằng cách sử dụng thuộc tính KnownTypeAttribute hoặc bằng cách thêm chúng vào danh sách các kiểu đã biết được truyền cho DataContractSerializer. '. Vui lòng xem InnerException để biết thêm chi tiết.
Tôi cũng cố gắng xác định lớp DataContract
mới với một thành viên dữ liệu duy nhất nhưng dẫn đến lỗi rất giống nhau.
Đây là mã cho điều đó, theo sau là ngoại lệ được ghi nhật ký bằng ghi nhật ký WCF.
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
Có lỗi trong khi cố gắng để serialize tham số: GetObjectResult. Thông điệp InnerException là 'Loại' System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = b77a5c561934e089], [SilverlightApplication7.Web.ObjectHolder, SilverlightApplication7.Web, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null]] [] 'với tên hợp đồng dữ liệu' ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'không được mong đợi. Thêm bất kỳ loại nào không được biết đến tĩnh vào danh sách các kiểu đã biết - ví dụ, bằng cách sử dụng thuộc tính KnownTypeAttribute hoặc bằng cách thêm chúng vào danh sách các kiểu đã biết được truyền cho DataContractSerializer. '. Vui lòng xem InnerException để biết thêm chi tiết.
Một lần nữa tôi đã chơi với ServiceKnownType
cho ObjectHolder
, ObjectHolder[]
và thậm chí ObjectHolder[][]
kể từ khi ngoại lệ đề cập đến một "ArrayOfArrayOfKeyValueOfstringObjectHolder
".
Vẫn chưa có giải pháp nào.
Bạn nhận được lỗi nào? –
Đoán của tôi sẽ là WCF có thể gặp khó khăn trong việc nối tiếp đối tượng. Bạn có thể thử làm từ điển của bạn nếu đó là khả thi. –
sipwiz
Tôi đồng ý với sipwiz, bạn sẽ gặp trục trặc khi sắp xếp thứ tự từ điển. Bạn nên làm cho từ điển chứa một đối tượng có thể tuần tự hóa (nghĩa là bạn cần thay đổi từ điển của bạn bằng Dictionary –
srodriguez