2009-03-11 20 views
16

Tôi mới bắt đầu sử dụng WCF và tôi đã đến một vấn đề thay đổi dự án. Tôi đã tạo một dịch vụ và đặt tham chiếu trong một dịch vụ web, nhưng mọi trường trong tệp xml webservice đều có trường ExtensionData.WCF: Có cách nào để xóa trường ExtensionData không?

Ví dụ:

loại bỏ ImageShack chết liên kết

Tôi không muốn điều này. Tôi cần nó để được chỉ:

loại bỏ liên kết ImageShack chết

Có cách nào để loại bỏ lĩnh vực này? Một số loại khác nhau của serialization?

+0

Bạn có thể vui lòng cụ thể hơn không? Bạn có ý nghĩa gì "mọi trường trong tệp ... xml"? Các tệp XML không có các trường. Bạn thấy ExtensionData ở đâu và tại sao nó lại là một vấn đề? –

Trả lời

2

ExtensionData được sử dụng để duy trì khả năng tương thích giữa các dịch vụ có thể chia sẻ hợp đồng với các phiên bản khác nhau. Nó có thể được bỏ qua một cách an toàn khi truyền tải thông điệp.

Bạn có thể loại bỏ nó bằng cách sử dụng một cái gì đó khác với bộ nối tiếp DataContract (im nghĩ trường cũ [Serializable]), nhưng tôi có thể sai.

10

ExtensionData thực sự là một tính năng phải được tích hợp vào loại để bật round-tripping. Nó luôn được phát ra bởi DataContractSerializer. Một cách có thể để triệt tiêu trường này đang sử dụng XmlSerializer cũ hơn bằng cách trang trí giao diện hợp đồng dịch vụ của bạn với XmlSerializerFormatAttribute.

+0

điều này là ngu ngốc vì nếu bạn đang cố gắng so sánh đối tượng cho một PUT và đảm bảo cùng một đối tượng đang quay trở lại, kiểm tra đơn vị của bạn không thành công do trường ngu ngốc này có dữ liệu trong phản hồi nhưng không có trong yêu cầu – PositiveGuy

+0

@MSSucks kiểm tra đơn vị của bạn nên kiểm tra các thuộc tính tĩnh và không thông qua ràng buộc trễ hoặc thời gian chạy? – moarboilerplate

0

Không trả lời câu hỏi, nhưng có lẽ điều này giúp ...

Từ MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx:

Tính năng tròn vấp ngã có thể được tắt, hoặc bằng cách thiết lập ignoreExtensionDataObject true trong constructor DataContractSerializer hoặc bằng cách đặt thuộc tính IgnoreExtensionDataObject thành true trên ServiceBehaviorAttribute. Khi tính năng này tắt, trình khử giải sẽ không điền thuộc tính ExtensionData và bộ nối tiếp sẽ không phát ra nội dung của thuộc tính.

+2

Đặt giá trị thành true không làm cho thuộc tính ExtensionData biến mất; nó chỉ ngăn chặn việc gửi dữ liệu, nếu có, cho khách hàng. –

3

Rất có thể, các lớp DataContract của bạn sẽ triển khai giao diện IExtensibleDataObject, phải không? Điều đó chịu trách nhiệm về trường ExtensionData - chỉ cần xóa giao diện đó và bạn cũng có thể xóa các trường ExtensionData khỏi DataContracts của mình.

Marc

+6

Nhưng giao diện là ẩn, vì vậy làm thế nào bạn có thể loại bỏ nó? – SteveC

-1

trang trí ServiceImplementation của bạn với [ServiceBehavior (IgnoreExtensionDataObject = true)]

[ServiceBehavior(IgnoreExtensionDataObject=true)] 
public class Service : IService {} 
2

Thiết tài sản để null ngăn chặn nó xuất hiện trong xml kết quả:

foreach(var elem in arrayOfElements) 
{ 
    elem.ExtensionData = null; 
} 
+0

Nhiều như tôi không thích sử dụng hack, đây là một giải pháp rất nhanh (tạm thời). +1 –

0

Nếu vấn đề của bạn là trong một xác nhận của một [TestMethod] bạn có thể sử dụng http://www.fluentassertions.com để loại trừ mọi ExtensionData thích hợp từ xác nhận của bạn.

Ví dụ:

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData)); 
0

lớp của bạn không nên kế thừa IExtensibleDataObject.

Vui lòng tham khảo các mô tả về Round-vấp ngã dưới đây:

Vòng-hoán đổi xảy ra khi dữ liệu được chuyển từ một phiên bản mới với một phiên bản cũ và chuyển sang phiên bản mới của hợp đồng dữ liệu. Bỏ qua đảm bảo rằng không có dữ liệu nào bị mất. Việc tắt bỏ qua giúp loại tiếp tục tương thích với bất kỳ thay đổi nào trong tương lai được hỗ trợ bởi mô hình phiên bản hợp đồng.

Để kích hoạt trip-vấp ngã cho một loại đặc biệt, loại nên thực hiện giao diện

IExtensibleDataObject

.

Giao diện người dùng chứa thuộc tính ExtensionData (ExtensionDataObject). Tài sản lưu trữ bất kỳ thông tin nào từ các phiên bản tương lai của hợp đồng dữ liệu không được biết đến với phiên bản hiện tại.

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