Trước tiên, bạn không bắt buộc phải cung cấp DataContract; WCF sẽ tuần tự hóa các đối tượng Class Old Plain (POCO) một cách chính xác miễn là bạn đang sử dụng .Net 3.5 SP1 hoặc mới hơn.
Thứ hai, bạn có thể chia sẻ cùng một tệp lớp vật lý trong các dự án trên cả máy chủ và phía máy khách; chúng tôi có các dự án có hàng trăm lớp (và mã) được chia sẻ trực tiếp theo cách này và nó tiết kiệm một lượng lớn thời gian và công sức trong việc phát triển và thử nghiệm.
Có một vài bước cần thiết để có được điều này và chạy (làm điều này từ bộ nhớ vì vậy tôi có thể cần phải điều chỉnh các câu trả lời):
1) Trong các mặt hàng khác, nếu bạn đang sử dụng VB, tạo ra một dự án trong cùng một không gian tên mặc định như các lớp mà bạn muốn sử dụng ở phía máy khách (đối với C#, điều này không quan trọng vì không gian tên được nhúng trong các lớp).
2) Thêm tệp lớp vào dự án làm liên kết để bạn có một bản sao vật lý của lớp.
3) Thêm dataContractSerializer vào cấu hình WCF của bạn nếu bạn chưa có.
4) Ở phía máy khách, nhấp chuột phải vào dịch vụ và chọn Định cấu hình tham chiếu dịch vụ ... Trong hộp thoại kết quả, đảm bảo rằng Reuse types in all referenced assemblies
được chọn và tùy chọn Reuse types in all referenced assemblies
được chọn.
5) Phần khó nhất để làm việc này là dành cho các bộ sưu tập.
a) Trang trí bộ sưu tập với thuộc tính CollectionDataContract.
b) Thêm mục nhập cho bộ sưu tập này vào bảng CollectionMappings
của . Để tìm reference.svcmap, hiển thị tất cả các tệp trong dự án và sau đó mở rộng dịch vụ. Để chỉnh sửa, chỉ cần nhấp đúp vào tệp.Bạn sẽ thêm mục nhập vào đây cho từng bộ sưu tập cụ thể mà bạn đang sắp xếp và bạn cần phân biệt giữa các mục có cơ sở Danh sách <> và những cơ sở có cơ sở từ điển <>. Nếu bạn không thực hiện bước này, WCF sẽ tự động tuần tự hóa các lớp này thành chữ ký chung bên dưới và bạn sẽ mất việc sử dụng các lớp của bạn.
Các mục trong bảng nhìn này một cái gì đó như thế này:
<CollectionMappings>
<CollectionMapping TypeName="System.Collections.Generic.Dictionary`2" Category="Dictionary" />
<CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" />
<CollectionMapping TypeName="System.Collections.Specialized.StringCollection" Category="List" />
<CollectionMapping TypeName="My.Namespace.MyDictionaryCollection" Category="Dictionary" />
Khi bạn thêm các mục và lưu các tập tin, các máy phát điện client-side WCF sẽ xây dựng lại Reference.cs hoặc tập tin reference.vb tùy thuộc vào ngôn ngữ bạn đang sử dụng. Bạn có thể biết nếu bạn không có tham chiếu được cấu hình đúng bằng cách nhìn vào mã đã tạo: nếu mã đó chứa các định nghĩa lớp, thì trình tạo mã WCF không thể ánh xạ vào các lớp đã sao chép của bạn vì lý do nào đó.
Một lưu ý cuối cùng: đôi khi trình tạo mã WCF hoàn toàn không tạo mã và điều này luôn do sự cố trong dịch vụ (thường là một lớp không phải là duy nhất đủ hoặc loại không thể được tuần tự hóa cho một lý do này hay cách khác).
Để gỡ lỗi loại vấn đề này, điều dễ nhất cần làm là thêm nhật ký chẩn đoán WCF, sẽ tạo tệp có thể được mở bằng công cụ đặc biệt (quên tên của nó) cho phép bạn đi sâu vào các thông báo lỗi và khám phá chính xác những gì đã xảy ra. Điều này đã tiết kiệm cho chúng tôi nhiều giờ làm việc. Để cấu hình khai thác gỗ này, thêm dòng sau vào web.config của bạn bất cứ nơi nào trong <configuration>
phần:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\log\WcfTrace.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Một khi bạn đã thêm này và lưu web.config, cố gắng cập nhật các tài liệu tham khảo phục vụ trong các khách hàng, sau đó nhấp đúp nhấp vào tệp nhật ký bạn đã chỉ định và công cụ sẽ mở.