我应该使用哪种数据类型作为Web API方法的返回值?

时间:2014-02-17 12:09:48

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

我有一个Web API控制器,可以将数据返回给我的客户端。代码如下所示:

    [HttpGet]
    [ActionName("Retrieve")]
    public IEnumerable<Reference> Retrieve(int subjectId)
    {
        return _referenceService.Retrieve(subjectId);
    }

有人能告诉我是否有必要指定ActionName?

我还应该返回IEnumerable,IList还是别的什么?

2 个答案:

答案 0 :(得分:2)

我相信如果您的ASP.NET路由设置正确,则无需指定ActionName,例如:

protected void Application_Start()
{
    RouteTable.Routes.MapHttpRoute("0", "{controller}/{action}/{arg1}");
}

将匹配/YourControllerName/Retrieve/132

您的归档完全取决于您的媒体类型格式化程序,其默认值为XmlFormatterJsonFormatter。这些可以在GlobalConfiguration.Configuration.Formatters中找到,并将根据客户提供的Accept标头进行选择。

例如,我们使用JSON.Net作为响应格式,配置如下:

protected void Application_Start()
{
    RouteTable.Routes.MapHttpRoute("0", "{controller}/{action}/{arg1}");

    MediaTypeFormatterCollection formatters = GlobalConfiguration.Configuration.Formatters;
    formatters.Remove(formatters.XmlFormatter);

    var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
    jsonFormatter.Formatting = Formatting.Indented;
    jsonFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
}

这告诉WebApi不允许任何XML格式化,只使用提供的JSON.Net合约解析器返回JSON。 JSON.Net支持序列化IEnumerable

但是,我会建议您返回HttpResponseMessage。这允许您设置状态代码(这仍然使用媒体类型格式化程序,它只是一个更清洁的包装器)。您可以像这样使用它:

[HttpGet]
public HttpResponseMessage Retrieve(int subjectId)
{
    var response _referenceService.Retrieve(subjectId);

    return Request.CreateResponse(HttpStatusCode.OK, response);
}

答案 1 :(得分:1)

如果没有要求,你应该返回HttpStatusCode而不是数据,比如POST方法应该返回OK或者其他什么。 或者如果想要像Get方法这样的记录应该返回记录类型。

你也不需要在Get,Put,Delete等方法上添加属性,因为webapi会根据动作自动检测方法,如果你正在获取数据,那么你的方法名称应该以GetEmployee等方式开始。