2010-10-18 23 views
18

Tôi đang tạo một dịch vụ WCF bằng cách sử dụng mô hình hợp đồng thông báo.Làm cách nào để kiểm soát tên của một Hợp đồng Thông báo WCF chung

tôi đã tạo ra một hợp đồng thông điệp yêu cầu chung chung như vậy:

[MessageContract] 
public Request<T> 
{ 
    [MessageBodyMember] 
    public T Details { get; set; } 
} 

Tôi đang sử dụng để sử dụng [DataContract(Name="Contract{0}")] để sản xuất tên có thể đọc được các hợp đồng dữ liệu chung, nhưng phương pháp này dường như không làm việc cho tôi sử dụng thông điệp hợp đồng.

Có cách nào để đạt được cùng một hành vi sử dụng mô hình hợp đồng thông báo không?

Trả lời

2

Có một tài sản WrapperNameWrapperNamespace trên thuộc tính MessageContract mà tôi nghĩ cũng làm như vậy. Ví dụ:

[MessageContract(WrapperName = "FooMessage", IsWrapped = true)] 
public class Request<T> 
{ ... } 

Lưu ý việc thêm thuộc tính IsWrapped để cho biết rằng thư phải được tuần tự hóa vào phần tử bao bọc.

+0

Tôi đã thử điều này bằng cách sử dụng WrapperName = "WrapperFor {0}", nhưng điều này giải quyết cho một tên khá khó chịu trong WSDL (Unicode tương đương với {0}) và không thực hiện bản dịch tôi đã mong đợi. –

+0

Ngoài ra, điều này dường như ném một ngoại lệ khi 'T' cũng xảy ra là loại chung và thuộc tính' DataContract Name' sử dụng trình giữ chỗ, ví dụ: 'GenericOf {0}'. Tôi muốn được quan tâm để biết nếu Generic MessageContracts và DataContracts có thể được sử dụng cùng với tên chung chung ghi đè vì vậy tôi đã đặt một tiền thưởng về câu hỏi này –

4

Dường như có rất nhiều công việc cho những gì bạn muốn hoàn thành, nhưng tôi tin rằng bạn có thể tạo một MessageInspector cho phép bạn tương tác trực tiếp với XML.

Trình kiểm tra thư khách hàng triển khai giao diện IClientMessageInspector và thanh tra thư dịch vụ triển khai giao diện IDispatchMessageInspector.

http://msdn.microsoft.com/en-us/library/aa717047.aspx

Bất kỳ dịch vụ (dispatcher) Thanh tra thông phải thực hiện hai phương pháp IDispatchMessageInspectorAfterReceiveRequestBeforeSendReply.

Liên kết đi vào nhiều chi tiết hơn, nhưng một khi bạn đã triển khai, bạn sẽ có thể thêm thanh tra vào web.config của mình và bạn sẽ được thiết lập.

+1

Tôi nghĩ rằng bạn có thể đã hiểu lầm câu hỏi. Do có MessageContract chung, ví dụ: 'Yêu cầu ', làm thế nào để có một tên * clean * được tạo trong WSDL cho các đầu vào được đóng chung loại 'Yêu cầu ' ví dụ 'Yêu cầu '. OP muốn tạo một tên như 'RequestOfServiceInput' trong WSDL cho kiểu generic cũ, nhưng có vẻ như việc đặt tên các kiểu generic cho MessageContracts không hoạt động giống như DataContracts như được mô tả ở đây: http://msdn.microsoft. com/en-us/library/ms731045.aspx # sectionSection4 –

+0

Bạn có thể đúng @RussCam. Trong trường hợp đó, anh ta sẽ cần sử dụng 'IWsdlExportExtension' để tùy chỉnh/mở rộng WSDL. Bạn có thể tìm thấy ví dụ về điều đó tại đây: http: //blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx – marcellscarlett

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