2009-04-22 20 views
16

Đối với tham số cho một OperationContract đại diện cho một ngày chỉ (không có thành phần thời gian hoặc thiết kế múi giờ), nó là mong muốn sử dụng xs: Date, để tránh bất kỳ sự mơ hồ hoặc vấn đề với chuyển đổi múi giờ giữa máy khách và máy chủ.Làm thế nào để tạo xs: Ngày trong tham số WCF OperationContract

WCF hiện chỉ hỗ trợ xs: DateTime để tuần tự hóa tham số DateTime.

Cách dễ nhất để tạo một OperationContract với một tham số sẽ được tuần tự hóa là xs: Date là gì?

Tôi đang nghĩ đến việc có một loại .NET tùy chỉnh "công khai struct DateOnly" hoặc tương tự, với việc đúc ngầm đến/từ một DateTime chuẩn, bằng cách nào đó sẽ tự động tạo ra wsdl như xs: Date.

Điều này có thể thực hiện được không và tôi sẽ triển khai như thế nào?

Nếu có thể, tôi nghi ngờ giải pháp có thể liên quan đến việc sử dụng XmlSchemaProviderAttribute trên loại tùy chỉnh, nhưng bất kỳ tài liệu nào tôi tìm thấy trên thuộc tính này có vẻ hơi đục.

Cập nhật

tôi cảm thấy khó khăn để tin rằng nó sẽ làm tăng probablity nhận được một giải pháp, nhưng tôi sẽ làm theo lời khuyên của trang web và bắt đầu một bounty.

Vì sự rõ ràng, điều kiện cho tiền thưởng là cung cấp tất cả các thông tin cần thiết để xây dựng một giải pháp để một tham số để một WCF OperationContract có thể là:

  • serialized như ws: Ngày và mô tả như như vậy trong WSDL được tạo ra.

  • là giá trị System.DateTime hoặc có thể được truyền ngầm đến/từ DateTime.

+0

Tôi tìm thấy đề xuất Kết nối đã đóng về điều này tại https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215. –

Trả lời

1

Thật không may WCF không hỗ trợ xs: Loại ngày. Bạn sẽ phải tạo cấu trúc "DateOnly" của riêng mình, như:

<DataContract()> _ 
public struct DateOnly 
    <DataMember()> public Month as Integer 
    <DataMember()> public Day as Integer 
    <DataMember()> public Year as Integer 
end struct 
+0

Có, tôi nghĩ rằng tôi muốn tạo cấu trúc của riêng mình, nhưng tôi muốn làm cho nó tuần tự hóa thành xs: Date (sử dụng serialization XML tùy chỉnh)? Vì vậy, các máy khách không phải WCF nhận ra xs: Date không cần một kiểu tùy chỉnh khác. – Joe

+0

Tôi không biết bất kỳ cách nào để thay đổi điều đó ngoại trừ việc sửa đổi XML của WSDL khi đang di chuyển. Tuy nhiên, tôi không chắc chắn về hiệu quả hoạt động của nó. Bài viết này không hoàn toàn giải quyết tình huống của bạn nhưng có thể giúp bạn bắt đầu cách sửa đổi nội dung thư SOAP. http://blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx – Keith

1

Trình tự tuần tự hóa của WCF (DataContractSerializer) không hỗ trợ. Nhưng XmlSerializer hỗ trợ nó.

1 - Thêm [XmlSerializerFormat] thuộc tính đến hợp đồng của bạn ...

[XmlSerializerFormat] 
[ServiceContract] 
public interface IMyContract 
{ 
    MyType GetData(); 
} 

2 - Trong các loại DataContract, thêm [XmlElement (DataType = "date")] để các thành viên.

public class MyType 
{ 
    [XmlElement(DataType = "date")] 
    public DateTime BirthDate {get; set;} 
} 

Hope this helps

+0

Điều này không giúp các tham số ngày cho một OperationContract. – Joe

+1

Tôi xin lỗi, tôi không nhận ra bạn đang nói về tham số DateTime đơn giản. Nhưng bạn sẽ không gặp vấn đề tương tự với các loại phức tạp của mình nếu bạn không chuyển sang [XmlSerializerFormat]? – Sylvain

+0

Có, vấn đề tương tự tồn tại đối với DataMembers và cho các tham số OperationContract. Đối với DataMembers, việc sử dụng XML Serialization là một giải pháp (ngay cả khi nó mất một số lợi ích của DataContracts). Nhưng tôi đang tìm một giải pháp hoạt động trong cả hai trường hợp, đang chờ xử lý mà Microsoft đang xem xét cho "v.Next": https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215 – Joe

5

Bây giờ này đã gây chú ý của tôi, tôi đã tạo ra một gợi ý mới trong Connect, tại Please Fully Support xs:Date for Date-Only Parameters and DataMembers. Tôi đánh giá điều này với bốn ngôi sao (quan trọng).

Nếu bất kỳ ai đọc điều này cảm thấy điều này là quan trọng (hoặc không đồng ý), thì hãy sử dụng Connect để bình chọn hoặc bình luận về nó.

+0

FYI: Tôi cũng đã xếp hạng đề xuất Kết nối của bạn 4 sao. – Sylvain

+0

Tôi chắc chắn nghĩ nó quan trọng. Trong đề xuất kết nối của bạn, bạn nói rằng "Tôi biết rằng người ta có thể sử dụng [XmlSerializationFormat] để làm cho XML Serializer được sử dụng thay cho Data Contractizer Serializer". Mặc dù đây là một giải pháp cho DataContracts, nhưng sự hiểu biết của tôi là không có cách nào để chỉ định serailization XML cho các tham số hợp đồng hoạt động. Sự hiểu biết này có đúng không? Trong mọi trường hợp, đáp ứng MS đối với đề xuất kết nối ban đầu (đóng) cho biết họ đang xem xét điều này cho "v.Next" (không chắc chắn nếu điều này có nghĩa là V4 hoặc phiên bản sau). – Joe

+0

Tôi tin rằng có thể định cấu hình toàn bộ hợp đồng dịch vụ, dịch vụ hoặc điểm cuối để sử dụng trình nối tiếp xml. Không hoàn toàn chắc chắn như thế nào. –

3

Bạn đã chỉ định yêu cầu có xs: Ngày làm tham số trong thao tác. Vấn đề là, có một cách chính thức để xác định các yêu cầu như vậy: WSDL. Nếu tôi đã làm điều này, tôi sẽ sử dụng phương pháp tiếp cận WSDL Đầu tiên. Bắt đầu với WSDL xác định hợp đồng bạn muốn, bao gồm ngày xs: trong giao diện, bất cứ nơi nào bạn muốn. Sau đó tạo ra các dịch vụ sơ khai bằng cách sử dụng svcutil.exe. Nhớ truyền vào/serializer: xmlSerializer.

3

Tôi cũng đã gặp sự cố được mô tả. Tôi đã phát triển giải pháp của riêng mình - loại tùy chỉnh WcfDate. Nó được xuất bản ở đây: WCF Support for xs:date

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