2009-06-26 40 views
7

Tôi đã tạo một dịch vụ web qua WCF. Sau đó, tôi tiếp xúc với nó như một dịch vụ web để làm cho nó có thể sử dụng được với một ứng dụng .NET 2.0. Tôi tạo ra một số DataContract với DataMember có thể được sử dụng bởi các tiếp xúc OperationContract.Tại sao Thuộc tính được Chỉ định của Thuộc tính Dữ liệu Web cần phải được đặt cho int và Dữ liệu nhưng không phải cho Chuỗi

Tôi nhận thấy rằng khi tôi cố gắng tạo DataClass được chuyển trong dịch vụ web mà mỗi thuộc tính DataContract hiện có thuộc tính "Chỉ định" đối tác cho từng thành viên.

Ví dụ:

[DataContract] 
public class Sales 
{ 

    [DataMember] 
    public int InvoiceNo; 

... 
} 

Khi tôi tạo ra một thể hiện của bán hàng trong các khách hàng dịch vụ web. Tôi nhận được thuộc tính có tên InvoiceNo và InvoiceNoSpecified. Bây giờ đây là câu hỏi của tôi, khi thuộc tính là loại chuỗi, tôi không cần đặt thuộc tính "Chỉ định" tương ứng thành true, nhưng khi loại thuộc tính là int hoặc DateTime, nếu tôi không đặt tương ứng thuộc tính "Chỉ định" thành true, giá trị trở thành null trong máy chủ dịch vụ web. Có cách nào để tránh đặt thuộc tính được chỉ định không? Vì tôi cần gọi các chức năng dịch vụ web ở nhiều nơi trong mã của tôi. Thật sự rất khó để theo dõi tất cả chúng.

Trả lời

3

Bạn có thể đọc giải thích here.

Trích từ :

Nếu một sơ đồ bao gồm một yếu tố mà là tùy chọn (minOccurs = '0'), hoặc nếu giản đồ bao gồm một giá trị mặc định, bạn có hai lựa chọn. Một tùy chọn là sử dụng System.ComponentModel.DefaultValueAttribute để chỉ định giá trị mặc định, như được hiển thị trong mã sau. Một tùy chọn khác là sử dụng một mẫu đặc biệt để tạo ra một trường hợp Boolean được nhận dạng bởi XmlSerializer và áp dụng XmlIgnoreAttribute cho trường này. Mẫu được tạo ở dạng thuộc tínhNameSpecified. Ví dụ: nếu có trường có tên "MyFirstName" , bạn cũng sẽ tạo trường có tên là "MyFirstNameSpecified" chỉ thị XmlSerializer có tạo thành phần XML có tên "MyFirstName" hay không.

Các chỉ thể chấp nhận được đối với tôi workaround tôi đã đi cho đến nay là sử dụng XmlSerializer thay vì DataContractSerializer bằng cách sử dụng XmlSerializerFormatAttribute.

+0

Tôi đã cố gắng sử dụng DefaultValueAttribute cho mục này. Khi tôi sử dụng giá trị mặc định, điều xảy ra là ngay cả khi tôi đặt giá trị của thông số ngày trong ứng dụng khách.Vì tôi không đặt dateSpecified = true nữa, giá trị ngày luôn là giá trị mặc định. // mã tại khách hàng prm.DepositDate = dtp_Deposit.Value.Date; // mã tại dịch vụ [DefaultValue (loạiof (Ngày giờ), "1900/01/01")] Tiền gửi công cộngNgày; – Nap

+0

Cảm ơn người đàn ông. Tôi đã có cùng một vấn đề với các dịch vụ python soaplib và .net khách hàng. Tôi luôn phải đặt Được chỉ định thành true. Dưới đây là ví dụ về cách sửa lỗi bằng Python: @rpc (soap_types.Int (min_occurs = 1), _returns = soap_types.String) – Elalfer

1

Ngoài ra bạn có thể sử dụng [DataMember(isRequired=True)]

8

Các thông số mặc định cho thuộc tính DataMember là:

bool EmitDefaultValue (default true) 
bool IsRequired (default false) 

Nếu tài sản bạn đang phơi bày là một loại giá trị không nullable bạn nên sử dụng:

[DataMember(IsRequired = true)] 
public int InvoiceNo; 
Các vấn đề liên quan