C# 到操作名称的Web API路由

C# 到操作名称的Web API路由,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我需要一个控制器来返回JavaScript使用的JSON,因此我从ApiController类继承了JSON,但它的行为与我预期的不一样。我找到的一本书Pro ASP.NET MVC 4和大多数在线示例都给出了如下示例: public class ServicesController : ApiController { public string[] MethodFruit() { return new string[] { "Apple", "Orange",

我需要一个控制器来返回JavaScript使用的JSON,因此我从
ApiController
类继承了JSON,但它的行为与我预期的不一样。我找到的一本书Pro ASP.NET MVC 4和大多数在线示例都给出了如下示例:

public class ServicesController : ApiController
{
    public string[] MethodFruit()
    {
        return new string[] { "Apple", "Orange", "Banana" };
}
通过URL访问:

http://mysite/services/methodfruit
但这永远不会起作用,因为找不到资源。我可以使用的唯一方法是让控制器为每个HTTP谓词包含不同的方法,然后:

http://mysite/api/services
它调用GET方法


我查看了Apress网站,但他们似乎没有任何论坛,当前的源代码是VS 2012,我没有使用。我检查了源文件,他们似乎认为前一种方法应该有效。是否不再支持前一种方法?

是的。。。通常,您必须遵循ASP.NET WEB API所期望的默认命名约定

检查此官方文件:

如果您不想遵循约定,可以尝试上述链接文档中描述的“按操作名称路由”部分

按操作名称路由

对于默认路由模板,WebAPI使用HTTP方法 选择操作。但是,您也可以创建管线,其中 URI中包含操作名称:

在您的情况下,您必须这样做:

[HttpGet]
public string[] MethodFruit()
{
    return new string[] { "Apple", "Orange", "Banana" };
}

如果希望Web API在路由时查找操作名称,请将App_Start文件夹中的WebApiConfig.cs类更改为:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
然后你就可以向

http://mysite/api/Services/MethodFruit

添加关于上述答案的附加信息。添加RoutePrefix有时会解决这个问题。希望它能帮助控制器

在配置中

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );

我也面临着同样的问题,我在代码中发现了这一点

using System.Web.Mvc; 
我已经导入了使用System.Web.Http的Mvc intead。 所以它使用的是Mvc路由,而不是webApi路由。 我把它换成了

using System.Web.Http 

这对我很有用。我添加了我的答案,这样新手就不会重复同样的错误了

我完全错过了WebApiConfig.cs课程。现在它变得更有意义了——我想知道为什么RouteConfig类没有改变……我也做了同样的事情。但是我想在
POST
request上调用这个函数。我在路由中添加了
{action}
,并添加了
[AcceptVerbs(“GET”、“POST”)]
而不是
[HttpGet]
。但当通过post请求访问此API时,它会显示404。当
没有问题时,获取
。我的操作名是
GetAuthToken
。我真的无法解决这个问题。请提供帮助。@shashwat检查这是否解决了您的问题:@LenielMacaferi我已经在使用
[System.Web.Http.AcceptVerbs(“GET”、“POST”)]
。请看我不确定你是否能在WebAPI中做到这一点。无论如何,检查一下这个类似的问题:在这里我们看到一个家伙正是这样做的:在action方法上使用[RoutePrefix(“api/referencedata”)]和[Route(“products”)]是唯一对我有效的方法。使用[Route(“api/referencedata”)][ActionName(“products”)时失败
using System.Web.Mvc; 
using System.Web.Http