我有一个Web API控制器,可以将数据返回给我的客户端。代码如下所示:
[HttpGet]
[ActionName("Retrieve")]
public IEnumerable<Reference> Retrieve(int subjectId)
{
return _referenceService.Retrieve(subjectId);
}
有人能告诉我是否有必要指定ActionName?
我还应该返回IEnumerable,IList还是别的什么?
答案 0 :(得分:2)
我相信如果您的ASP.NET路由设置正确,则无需指定ActionName
,例如:
protected void Application_Start()
{
RouteTable.Routes.MapHttpRoute("0", "{controller}/{action}/{arg1}");
}
将匹配/YourControllerName/Retrieve/132
您的归档完全取决于您的媒体类型格式化程序,其默认值为XmlFormatter
和JsonFormatter
。这些可以在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等方式开始。