ОТДЫХ с обнуляемыми типами? - PullRequest
8 голосов
/ 04 октября 2011

Я ударил кирпичную стену.Моя реализация REST не будет принимать значения Nullable.

    [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 ]

5 голосов
/ 02 ноября 2011

Переменные для значений запроса 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 () для строки на принимающей стороне.

0 голосов
/ 08 ноября 2011

Проблема в том, что вы пытаетесь преобразовать значение строки запроса в обнуляемое значение, так как в истинном SOAP ваш запрос будет XML, который поддерживает обнуляемые значения.

Если вы твердо сохраняете структуру вашего метода, и CheckedDate действительно является необязательным, то вы должны изменить его на необязательный параметр.

GetMethod(...., DateTime CheckStartDate = default(DateTime), DateTime CheckEndDate = default(DateTime))

и затем в вашем методе проверьте CheckedDate > DateTime.MinValue

...