2010-03-06 36 views
6

Tôi đã tạo một lược đồ như là một giao thức được thỏa thuận giữa công ty chúng tôi và một công ty bên ngoài. Bây giờ tôi đang tạo một dịch vụ web WCF C# để xử lý giao diện.xsd.exe - lược đồ đến lớp - để sử dụng với WCF

Tôi đã chạy tiện ích XSD và tạo một lớp C#. Lược đồ được xây dựng trong BizTalk và tham khảo các lược đồ khác, vì vậy tất cả trong tất cả đều có hơn 15 lớp được tạo ra.

Tôi đặt thuộc tính [DataContract} ở trước mỗi lớp. Tôi có phải đặt thuộc tính [DataMember] trên mỗi thuộc tính không?
Khi tôi tạo chương trình thử nghiệm của khách hàng, proxy không có bất kỳ mã nào cho bất kỳ lớp nào trong số 15 lớp này.

Chúng tôi đã sử dụng kỹ thuật này khi sử dụng dịch vụ .asmx, nhưng không chắc chắn liệu nó có hoạt động giống với WCF hay không. Nếu chúng ta thay đổi lược đồ, chúng ta sẽ muốn tạo lại lớp WCF, và sau đó chúng ta sẽ haev đến mỗi lần trang trí lại nó với tất cả các thuộc tính [DataMember]? Có một công cụ mới hơn tương tự như XSD.exe sẽ làm việc tốt hơn với WCF?

Cảm ơn,

Neal Walters

SOLUTION (chôn cất tại một trong Saunders câu trả lời/bình luận):

Thêm XmlSerializerFormat để định nghĩa giao diện:

[OperationContract] 
    [XmlSerializerFormat]  // ADD THIS LINE 
    Transaction SubmitTransaction(Transaction transactionIn); 

Hai ghi chú: 1) Sau khi tôi đã làm điều này, tôi thấy nhiều hơn nữa. xsds trong proxy của tôi (Se rvice Reference) kiểm tra chương trình client, nhưng tôi không thấy các lớp mới trong intelliSense của mình. 2) Vì lý do nào đó, cho đến khi tôi xây dựng dự án, tôi đã không nhận được tất cả các lớp trong phần intellisense (không chắc chắn lý do).

Trả lời

4

Các lớp sử dụng [DataContract] sẽ được tuần tự hóa thành một lược đồ rất hạn chế. Ví dụ, sẽ không có thuộc tính, chỉ các phần tử. Đây là cố ý, và được thực hiện cho hiệu suất và khả năng tương tác.

Nói chung, lược đồ loại bạn có thể đang làm việc có thể phức tạp hơn nhiều. Một lược đồ như vậy sẽ không thể sử dụng được với Bộ nối tiếp hợp đồng dữ liệu. Bạn sẽ cần phải sử dụng XML Serializer để thay thế.

Cụ thể, không chỉnh sửa các lớp do XSD.EXE tạo. Trên thực tế, bạn không bao giờ nên chỉnh sửa mã đã tạo vì các chỉnh sửa của bạn sẽ bị xóa ngay khi mã được tạo lại. Những lớp học này đã có các thuộc tính trên chúng cần thiết để WCF làm việc với chúng.

Điều gì sẽ xảy ra nếu bạn chỉ sử dụng chúng như hiện trạng?

+0

1) Khi tôi tạo ra một chương trình thử nghiệm của khách hàng, các proxy không có bất kỳ mã cho bất kỳ trong số này 15 lớp học. Sự hiểu biết của tôi là WCF yêu cầu [DataContract] và [DataMember] để hiển thị đúng cách. Tất cả các yếu tố đều tốt với tôi. 2) Tôi hoàn toàn đồng ý về việc không muốn thay đổi mã, đó là lý do tại sao tôi đăng câu hỏi. 3) Tôi nên tìm kiếm những gì để tìm hiểu thêm về XmlSerializer? Nó có tạo mã C# từ tệp .xsd không? Tôi có thể đã sử dụng nó ở khách hàng cuối cùng, nhưng cần phải truy cập vào gmail của tôi (bị chặn ở đây). – NealWalters

+2

Sử dụng [XmlSerializerFormat] trên mỗi thao tác dịch vụ web yêu cầu XML serialization. Tiện ích XSD đã thực hiện tất cả công việc khác cho bạn. –

+0

@Downvoter: lý do cho downvote? –

5

Neal, ngoài tất cả các tùy chọn mà John đã cung cấp cho bạn, bạn cũng nên xem WCSF.công cụ màu xanh trên CodePlex: http://wscfblue.codeplex.com/

Đó là một cách tiếp cận "hợp đồng đầu tiên" để làm WCF, và một trong nhiều lựa chọn nó cung cấp là tạo ra một tập tin WCF DataContract từ XSD của bạn:

alt text http://i50.tinypic.com/rj1sw0.png

này sau đó bật lên một hộp thoại trong đó bạn có thể thiết lập một loạt các thông số về cách tạo C tập tin # lớp học của bạn từ XSD:

alt text http://i46.tinypic.com/315h8yh.png

Khá hữu ích, ngay cả khi bạn muốn sử dụng nó không có gì hơn là chuyển đổi các lớp XSD thành C# hoạt động như WCF DataContracts :-)

Xem thêm blog post để giải thích thêm về quy trình tạo dữ liệu XSD DataContract.

+0

Cảm ơn, tải ngay bây giờ ... – NealWalters

+0

câu hỏi Đăng trong thảo luận CodePlex của họ vào đây: http://wscfblue.codeplex.com/Thread/View.aspx?ThreadId=204204 - làm thế nào để làm việc với một XSD được tạo ra với BizTalk 2006/R2 trong VS2005. – NealWalters

+0

Vui lòng nhận xét hoặc xác nhận câu trả lời mới của tôi. – NealWalters

3

Tôi bị sốc mà không ai chỉ cho tôi để tiện ích này, mà tôi tin là những gì tôi đã được yêu cầu:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.xsddatacontractimporter.aspx

Tôi đã không thử nó chưa, nhưng có vẻ như là XsdDataContractImporter những gì tôi đang tìm kiếm, hoặc SVCUTIL với cờ/dataContractOnly.

Tôi đã học được điều này khi phỏng vấn một ứng cử viên hôm qua. Cô cho biết serialization DataContract là nhanh hơn và sẽ được ưa thích để sử dụng.

Neal

1

Re: lớp XsdDataContract bạn đề cập trong followup của bạn, IMO, Đây là một lớp học thích hợp (như là ServiceContractGenerator vv) vì vậy tôi không ngạc nhiên khi không có ai chỉ bạn với nó. Bạn vẫn cần phải gói nó lên để làm cho nó thực sự hữu ích. Tôi khá chắc chắn rằng mẫu mã chỉ bao gồm các trường hợp sử dụng rất cơ bản vì vậy tôi hy vọng sẽ làm rất nhiều công việc với điều đó để có được nó vào một trạng thái làm việc thích hợp. . Và như tôi đã đề cập trên diễn đàn WSCF, Svcutil, wscf, xsd.exe và những người khác đều sử dụng lớp này và các lớp liên quan trong quá trình gen mã.

Kính trọng việc thực hiện serializer, có những bài viết thực sự tốt trên blog Youssef Moussaoui về việc serializers khác nhau và hiệu suất của họ đặc biệt là http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

Ngoài ra còn có một cuộc thảo luận thực sự tốt ở đây trên Connect về hai serializers (XS và DCS) và một điểm hữu ích mà XS vẫn là con đường phía trước cho WSDL/XSD Phát triển đầu tiên vì DCS chỉ nhằm hỗ trợ một mô hình lập trình đơn giản và do đó không hỗ trợ các cấu trúc xml khác nhau. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

Hope this helps, Chúc mừng, Benjy

+0

Cảm ơn, chúng tôi đã tranh luận vài ngày vào tuần trước những ưu điểm của DataContract vs XmlSerializer. Chuyên gia WCF mới của chúng tôi dường như nghĩ rằng việc sử dụng XmlSerializer không tận dụng hết các tính năng WCF. Bạn có nghĩ đó là sự thật không? Tôi đang đi đọc các blog mà bạn đã đề cập ngay bây giờ. – NealWalters

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