【问题标题】:Get error when I try to pass date value in URL to web api method当我尝试将 URL 中的日期值传递给 Web api 方法时出现错误
【发布时间】:2016-05-31 16:31:18
【问题描述】:

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

 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)

这是我用来异步调用我的 web api 方法的 angularjs 服务:

$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>

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

【问题讨论】:

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


    【解决方案1】:

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

    $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;
    }
    

    它按预期回显日期。

    【讨论】:

    • 我尝试像新的 Date(Date.UTC(2001, 1, 1,1,1,1,1)) 那样使用 UTC。但它没有工作
    • @Michael 这与我的建议不同。使用Date.UTC 与日期如何序列化为字符串无关。如果您还没有,请务必查看发送到服务器的 URL。这可能会更清楚。您还可以通过在浏览器中手动加载 URL 或使用 CURL 来尝试不同的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多