【问题标题】:web api 2 route not being found未找到 web api 2 路由
【发布时间】:2017-02-28 18:25:08
【问题描述】:

我的路线配置如下所示

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

我将我的用户控制器按操作划分为单独的文件,因此所有GET 操作都在GetUserController.cs 文件中,PUT 操作在PutUserController.cs 中等等...

GET 文件有一个像这样的部分类

[RoutePrefix("api/users/{userId:Guid}/locations")]
public partial class UsersController : MyCustomApiController
{    
    [Route("{locationId:Guid}/list")]
    [HttpPost]
    public async Task<IHttpActionResult> GetUsers(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request)
    { 
    }
}

PUT 文件有一个像这样的部分类

public partial class UsersController : MyCustomApiController
{    
    [Route("{locationId:Guid}/insert")]
    [HttpPut]
    public async Task<IHttpActionResult> InsertUser(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request)
    { 
    }
}

无论我做什么,我总是会收到 404 错误。我正在使用 Content-Type 作为 application/json 使用 Postman 进行测试 我使用的网址是 http://localhost:52450/api/users/3F3E0740-1BCB-413A-93E9-4C9290CB2C22/locations/4F3E0740-1BCB-413A-93E9-4C9290CB2C22/list 和 POST 因为我无法使用 GET 为第一种方法发布复杂类型

和

http://localhost:52450/api/users/3F3E0740-1BCB-413A-93E9-4C9290CB2C22/locations/4F3E0740-1BCB-413A-93E9-4C9290CB2C22/insert 和 PUT

如果需要的话,我还需要在路由配置中设置哪些其他路由?

编辑

奇怪的是,另一个也是部分类的控制器似乎可以使用相同的配置

[RoutePrefix("api/products")]
public partial class ProductController : MyCustomApiController
{

    [Route("insert")]
    [HttpPut]
    public async Task<IHttpActionResult> InsertProduct([FromBody] InsertProductRequest request)
    {
    }
}

这是连接一切的global.asax.cs。

protected void Application_Start(object sender, EventArgs e)
{

    AreaRegistration.RegisterAllAreas();

    GlobalConfiguration.Configure(WebApiConfig.Register);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterFilters(GlobalFilters.Filters);

    // Only allow Tls1.2!
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;


}

【问题讨论】:

    标签: c# asp.net-web-api2 asp.net-web-api-routing route-constraint


    【解决方案1】:

    您可以尝试在 WebApiConfig 中这样做:

      config.MapHttpAttributeRoutes();
      var corsAttr = new EnableCorsAttribute("*", "*", "*");
      config.EnableCors(corsAttr);
    

    【讨论】:

      【解决方案2】:

      那是配置 Web API 路由的错误配置文件。

      //global.asax.cs
      GlobalConfiguration.Configure(WebApiConfig.Register); // <-- WEB API
      RouteConfig.RegisterRoutes(RouteTable.Routes); // <-- MVC
      

      检查 WebApiConfig.cs 以配置 Web API 路由。

      public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              // Attribute routing.
              config.MapHttpAttributeRoutes();
      
              // Convention-based routing.
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
          }
      }
      

      您对Guid 的路由限制也是错误的。应该是{parameterName:guid}

      [RoutePrefix("api/users/{userId:guid}/locations")]
      public partial class UsersController : MyCustomApiController { 
          [HttpPost]
          [Route("{locationId:guid}/list")]
          public async Task<IHttpActionResult> GetUsers(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request) { ... }
      }
      

      来源:Attribute Routing in ASP.NET Web API 2

      【讨论】:

      • 感谢您的回复。我没有其他部分文件的前缀。这被错误地复制到了问题中。我已经纠正了。在您的第二个提示中,WebApiConfig.cs 中的 config.MapHttpAttributeRoutes() 调用 Routeconfig.cs 中的 RegisterRoutes 方法
      • @user20358,不,它没有。仔细地看。 MVC 和 Web API 的两种不同注册方式
      • 这很奇怪。我在同一个项目中有另一个控制器可以工作。它也是一个部分类。将用这些细节更新我的主要问题。另外,我在路由配置中放置了一个断点,并且从 WebApiConfig.cs 调用了 routeconfig.cs 中的 registerroutes
      • @user20358,除非您更改了某些内容,否则我可以向您保证,情况并非如此。展示你的创业公司。
      • 没有 startup.cs 它只是 global.asax,我将添加到主要问题中
      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 2017-08-16
      • 2014-03-22
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2020-04-20
      相关资源
      最近更新 更多