可空类型的REST?

8

我遇到了困境。我的REST实现不接受可空值。

    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/Transactions?AccNo={AccNo}&CostCentreNo={CostCentreNo}&TransactionType={TransactionType}&Outstanding={Outstanding}&CheckStartDate={CheckStartDate}&CheckEndDate={CheckEndDate}")]
    List<Transactions> GetTransactions(Int32 AccNo, Int32 CostCentreNo, Int32 TransactionType, Boolean Outstanding, DateTime? CheckStartDate, DateTime? CheckEndDate);

我的原始SOAP实现确实有这个问题。有什么解决办法吗?还是我需要重写代码?

我仍然不太明白为什么必须将日期时间设为可空才能设置为null。


2
一个被清零的DateTime仍然有实际值,就像int、float等一样。这是所有值类型的情况,因此Nullable存在的原因。 - Chris Charabaruk
1
一个 DateTime 不能为 null,因为它是一个结构体,而不是一个类。结构体的行为很像值类型。 - ssamuel
你能否使CheckStartDateCheckEndDate成为可选参数(使用RouteParameter.Optional),然后只需在查询字符串中选择性地传递它们? - mo.
1个回答

5

UriTemplate查询值的变量必须具有可以由QueryStringConverter转换的类型。可为空的类型不是。

您可以将参数包装起来,并通过POST传递,如下所示:

[DataContract(Name = "Details", Namespace = "")]
public class Details
{
    [DataMember]
    public Int32 AccNo;
    [DataMember]
    public Int32 CostCentreNo;
    [DataMember]
    public Int32 TransactionType;
    [DataMember]
    public Boolean Outstanding;
    [DataMember]
    public DateTime? CheckStartDate;
    [DataMember]
    public DateTime? CheckEndDate;

    public Details()
    {}
}

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Transactions",
     RequestFormat = WebMessageFormat.Json,
     ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Bare)]
List<Transactions> GetTransactions(Details details);

你可以选择将日期作为字符串而不是DateTime传递,然后在接收端使用DateTime.Parse()方法将其转换为DateTime格式。


1
在将参数发送到服务之前,需要对其进行序列化以进行包装。如此处所示,而在您的原始解决方案中,您可以直接在URL中指定参数。 - Avilan
1
你使用哪种方式取决于你对服务的要求。例如,如果你的客户使用 Linux 连接到服务,直接在 URL 中将参数作为字符串传递会比在非 Windows 机器上序列化对象更简单。 - Avilan
我会调查一下,有机会的时候试一试。谢谢。 - IAmGroot
哦,我试着使用它后,发现你创建了一个用于SOAP的自定义类。我更喜欢在SOAP中公开参数,而不是使用代表它们的自定义类。 - IAmGroot
正如我在帖子底部提到的那样,一个解决方案是将可空的DateTime对象转换为字符串对象,并对于null值传递“null”值,对于日期则传递.ToString()。 然后在接收端,您可以创建一个可空的DateTime对象,并且如果字符串等于“null”,则将对象设置为null。如果不是“null”,则使用DateTime.Parse(“datestring”)将字符串解析回DateTime对象。 - Avilan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接