【问题标题】:Route and RoutePrefix issue within asp.net web api applicationasp.net web api应用程序中的Route和RoutePrefix问题
【发布时间】:2016-06-26 14:09:16
【问题描述】:

我有一个 web api 应用程序,我需要在其中更改路由配置。

Javascript

$.ajax({
        type: "GET", 
        url: "api/collaborators",
        success: function (data) {

        }});

在控制器中

[RoutePrefix("api/")]
public class AccountManageController : BaseApiController
{
    [Authorize]
    [HttpGet]
    [Route("collaborators")]
    public IEnumerable<CollaborateurModel> GetAllCollaborators() {...}
}

我收到一个异常,表明找不到该服务!此外,即使我将 url 直接放在浏览器中,我也会得到相同的结果。

WebApiConfig.cs

public static class WebApiConfig
{
    public static string UrlPrefix { get { return "api"; } }
    public static string UrlPrefixRelative { get { return "~/api"; } }

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi2",
            routeTemplate: WebApiConfig.UrlPrefix + "/{controller}" 
        ); 
    }
}

我需要知道

  1. 问题的原因是什么?
  2. 我该如何解决?

谢谢,

【问题讨论】:

    标签: javascript c# ajax asp.net-mvc-5 asp.net-web-api2


    【解决方案1】:

    1) 你正在尝试使用Attribute Routing ASP.NET Web API 2,但你不是Enabling Attribute Routing

    2) 这就是你修复它的方法。

    public static class WebApiConfig {
    
        public static string UrlPrefix { get { return "api"; } }
        public static string UrlPrefixRelative { get { return "~/api"; } }
    
        public static void Register(HttpConfiguration config) {
             //Enable Web API Attribute routing.
             config.MapHttpAttributeRoutes();
    
            // Other Web API configuration
            config.Routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
            );
    
            config.Routes.MapHttpRoute(
               name: "DefaultApi2",
               routeTemplate: WebApiConfig.UrlPrefix + "/{controller}" 
            );
        }
    }
    

    【讨论】:

      【解决方案2】:

      属性路由和模板路由是两个不同的东西。

      如果您的路由规则“匹配”配置的路由模板,则无需添加自定义属性。

      但如果您想为“特殊”路由/操作使用属性 - 使用必须将 MapHttpAttributeRoutes() 添加到您的路由注册逻辑中(在第一次 config.Routes.MapHttpRoute... 调用之前)。

      没有这个,您的方法GetAllCollaborators 可以通过/api/AccountManage/GetAllCollaborators url 访问(根据您的第一个路由模板“DefaultApi”)

      【讨论】:

      • 你混淆了MapMvcAttributeRoutesMapHttpAttributeRoutes
      • 哎呀,你说得对。我已经深入vNext,MVC和WebAPI是统一的,不好意思。固定。
      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多