我尝试将URL中的日期值传递给web api方法时出错

时间:2016-05-31 16:31:19

标签: angularjs asp.net-web-api asp.net-web-api2

我在客户端创建了这个日期变量:

 this.latestDate = new Date(2001, 1, 1,1,1,1,1);

这是客户观看的样子:

self.latestDate: Thu Feb 01 2001 01:01:01 GMT+0200 (Jerusalem Standard Time)

这里是angularjs服务,我用asyncroniusly调用我的web api方法:

$http.get(serviceUrl + "?date=" + self.latestDate);

这是我从cilent调用的web api方法:

    [HttpGet]
    public HttpResponseMessage GetByDate(DateTime date){}

但每次我调用上面的web api方法时,我都会在cilent上出现此错误:

<Error>
<Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'date' of non-nullable type 'System.DateTime' for method 'System.Net.Http.HttpResponseMessage GetByDate(System.DateTime)' in 'SensorObservation.Web.SensorsDataController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>

我知道为什么会出现上述错误?

1 个答案:

答案 0 :(得分:0)

首先,这样做是一个非常糟糕的主意:

$http.get(serviceUrl + "?date=" + self.latestDate);

URL是结构化文本格式;它具有必须遵循的格式规则。当您使用简单的字符串连接将非结构化文本转储为结构化格式时,您可能会破坏其中一些规则。我建议您使用jQuery param function

其次,您使用默认格式将日期序列化为字符串,该格式是您在客户端监视中看到的格式。这可能在服务器上也可能不起作用。更好的选择是使用ISO 8601等众所周知的格式进行序列化。我建议使用JavaScript date toISOString function进行序列化。

应用这些更改后,您的API调用代码将如下所示:

var query = jQuery.param({ date: self.latestDate.toISOString() });
$http.get(serviceUrl + "?" + query);

<强>更新

我已经运行了一个快速测试,因为我已经使用了我的WebAPI代码,只要URL格式正确,您就可以创建并使用带有DateTime参数的端点。

我的测试端点如下所示:

[HttpGet]
[Route("test/datetest")]
public HttpResponseMessage DateTest(DateTime d)
{
    HttpResponseMessage response = new HttpResponseMessage();
    response.Content = new StringContent(d.ToString(), Encoding.UTF8, "text/plain");
    return response;
}

它按预期回复了日期。