希望在REST API的GET/PUT/DELETE/POST请求中使用相同的URL,但当不同HTTP方法是Action唯一不同的时候,它会认为它们是重复的!
"该类型已经定义了一个成员名为'Index',具有相同的参数类型。"
我想说,那又怎样?这一个只接受GET请求,那一个只接受POST请求...应该能够共存才对吧?
如何实现呢?
希望在REST API的GET/PUT/DELETE/POST请求中使用相同的URL,但当不同HTTP方法是Action唯一不同的时候,它会认为它们是重复的!
"该类型已经定义了一个成员名为'Index',具有相同的参数类型。"
我想说,那又怎样?这一个只接受GET请求,那一个只接受POST请求...应该能够共存才对吧?
如何实现呢?
这不是ASP.NET MVC的限制或其他什么。这是.NET和类的工作方式:无论你如何努力,你都不能在同一个类上有两个方法,它们具有相同的名称并且接受相同的参数。你可以使用[ActionName]
属性欺骗系统:
[HttpGet]
[ActionName("Foo")]
public ActionResult GetMe()
{
...
}
[HttpPut]
[ActionName("Foo")]
public ActionResult PutMe()
{
...
}
[HttpDelete]
[ActionName("Foo")]
public ActionResult DeleteMe()
{
...
}
[HttpPost]
[ActionName("Foo")]
public ActionResult PostMe()
{
...
}
[HttpPost]public ActionResult Foo(AModelToCreate model) { ... }
,这当然与只需要一个id
的GET操作不同。 - Darin Dimitrov虽然ASP.NET MVC允许您拥有两个相同名称的操作,但.NET不允许您拥有具有相同签名的两个方法——即具有相同名称和参数。
您需要对这些方法进行不同的命名,并使用ActionName
属性来告诉ASP.NET MVC它们实际上是相同的操作。
话虽如此,如果您谈论的是GET
和POST
,那么这个问题可能会消失,因为POST
操作将比GET
操作传递更多参数,从而可以区分它们。
所以,您需要:
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost, ActionName("ActionName")]
public ActionResult ActionNamePost() {...}
或者:
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost]
public ActionResult ActionName(string aParameter) {...}
string httpMethod = Request.HttpMethod.ToUpperInvariant();
switch (httpMethod)
{
case "GET":
return GetResponse();
case "POST":
return PostResponse();
default:
throw new ApplicationException(string.Format("Unsupported HttpMethod {0}.", httpMethod));
}
作为一种解决办法,你可以在其中一个方法中添加一个带有默认值的额外参数,以绕过限制并能够进行构建。
当然要记住,这不是最推荐的做法,你还需要在代码中明确说明(通过参数名称或注释),这是一个额外的参数仅用于允许构建,并且当然要确保你已经正确地装饰了属性。