【发布时间】:2018-03-20 12:03:39
【问题描述】:
我在WebApiConfig 文件中配置了以下路由配置,以通过实际方法(操作)名称以及默认调用模式调用Web api控制器方法。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
//By specifying action name
config.Routes.MapHttpRoute(
name: "DefaultApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Default calling pattern
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "DefaultAction", id = RouteParameter.Optional }
);
}
}
下面是控制器
public class TestController
{
List<int> _lst;
[ActionName("DefaultAction")]
public HttpResponseMessage Get()
{
_lst = new List<int>() { 1, 2, 3, 4, 5 };
return ToJson(_lst);
}
[ActionName("DefaultAction")]
public HttpResponseMessage Post(int id)
{
_lst.Add(id);
return ToJson(1);
}
[ActionName("DefaultAction")]
public HttpResponseMessage Put(int id)
{
//doing sothing
return ToJson(1);
}
[ActionName("DefaultAction")]
public HttpResponseMessage Delete(int id)
{
//doing sothing
return ToJson(1);
}
public HttpResponseMessage Save(int id)
{
//doing sothing
return ToJson(1);
}
private HttpResponseMessage ToJson(dynamic obj)
{
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json");
return response;
}
}
使用以下 url 调用 webapi 控制器 Post 或“Get”方法工作正常,结果符合预期。
POST -> http://localhost:56114/api/Test/
GET -> http://localhost:56114/api/Test/
使用以下 url 调用 webapi 控制器 Save 方法也可以正常工作,结果符合预期。
POST -> http://localhost:56114/api/Test/Save/1
但是当我通过下面给定的 url 调用 api 控制器的 PUT 或 DELETE 方法时,它不会调用任何 (PUT/DELETE) 方法
PUT -> http://localhost:56114/api/Test/3
删除 -> http://localhost:56114/api/Test/4
它给出以下错误信息
{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:56114/api/Test/3'.",
"MessageDetail": "No action was found on the controller 'Test' that matches the name '3'."
}
任何人都可以帮助我解决为什么默认 URL 模式没有调用 PUT 和 DELETE 方法。
我想使用以下 URL 模式调用我上面的所有方法
POST -> http://localhost:56114/api/Test/ -> should call Post
GET -> http://localhost:56114/api/Test/ -> should call Get
PUT -> http://localhost:56114/api/Test/3 -> should call Put
DELETE -> http://localhost:56114/api/Test/4 -> should call Delete
POST -> http://localhost:56114/api/Test/Save/1 -> should call Save
【问题讨论】:
-
问题是参数名称:
int value如果您将它们重命名为int id,那么它可能会起作用或在您的方法上方添加属性:[Route("{value:int}]还有,@ 是什么987654336@被用来做什么?是来自mvc而不是webapi,你应该使用RouteAttribute。 -
感谢@Ric,我已将“int value”更改为“int id”,将 [ActionName("DefaultAction")] 更改为 [RouteAttribute("DefaultAction")] 和默认值:new { action = "DefaultAction", id = RouteParameter.Optional } 到默认值:new { Name = "DefaultAction", id = RouteParameter.Optional } 但它仍然不起作用,即使现在我通过“Post”调用方法它总是调用“public HttpResponseMessage仅限 Save(int id)" 方法。
-
从你的方法中移除
[ActionName("DefaultAction")]然后调用它们。 -
@Ric,你的意思是说删除 [RouteAttribute("DefaultAction")] 因为我已经用 [RouteAttribute("DefaultAction")] 替换了所有 [ActionName("DefaultAction")] ?
-
您的示例中实际上并不需要它们,为了清楚起见,可能值得在您的方法签名上方添加
[HttpPost]、[HttpPut]。但除非您的方法名称与您想要调用的名称完全不同,否则没有真正的理由使用它们。
标签: asp.net-mvc asp.net-web-api2 postman