FromUri属性不适用于字符串/对象字典

时间:2014-12-07 03:37:24

标签: c# asp.net-web-api

我有一个试图获取字符串/对象字典的Web服务控制器。我认为,因为它可以隐式地将有问题的对象(DateTime)转换为字符串,所以我不必使用[FromUri]属性,但是当我对其进行调试时,它是null。所以我在那里扔了一个[FromUri],它有一本字典,但它是空的。 uri看起来像这样:

http://localhost:2806/api/Controller/MethodName?@StartDate=11/1/14&@EndDate=12/1/14

有人能看到明显的问题吗?如果更多情况有帮助,请告诉我。

我的控制器看起来像这样:

[HttpGet]
    public HttpResponseMessage MethodName([FromUri]Dictionary<string, object> parametersDictionary)
    {
        try
        {
            var messages = DbBuisnessLogic.GetDataFromDb(parametersDictionary);
            var json = JsonConvert.SerializeObject(messages);
            return Request.CreateResponse(HttpStatusCode.OK, json);
        }
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(e.Message));
        }
    }

1 个答案:

答案 0 :(得分:1)

如果您的网址如下所示,则会有效:

http://localhost/api/Controller/MethodName/?parametersDictionary[0].Key=StartDate&parametersDictionary[0].value=20141201T0003Z&parametersDictionary[1].Key=EndDate&parametersDictionary[1].Value=20141207T0003Z

您会注意到传递的日期格式不同。这是因为不允许使用示例Uri中的斜杠(因为斜杠用作路径的一部分)。

我还建议改变你完全使用从Uri读取字典的策略。它有点难看,如果你只是接受一定数量的参数(即只是开始和结束日期),那么我只定义一条明确接受它们的路线。它在Uri中看起来不那么糟糕,代码更易于处理。我假设您提供的示例是您尝试实现的简化版本,但即便如此,如果您知道要接受的所有可能值,请定义它们。例如:

public HttpResponseMessage Get([FromUri]DateTime startDate, [FromUri]DateTime endDate)

然后致电

http://localhost/api/Controller/MethodName/?startDate=20141201T0003Z&endDate=20141207T0003Z