我在客户端创建了这个日期变量:
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>
我知道为什么会出现上述错误?
答案 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;
}
它按预期回复了日期。