【问题标题】:I can't reach route api/v2/ExternalCodes using RouteAttribute我无法使用 RouteAttribute 到达路由 api/v2/ExternalCodes
【发布时间】:2015-12-09 15:41:43
【问题描述】:

我正在使用 Web Api 2、C# 和 .NET Framework 4.5.1 开发一个 ASP.NET MVC 网站。

我正在尝试进行版本控制,但我做错了。

我在新命名空间中创建了新版本的控制器:

namespace MyProject.Web.API.Controllers.v2
{
    [AllowAnonymous]
    [ActionLogFilter]
    public class ExternalCodesController : ApiController
    {
        public ExternalCodesController()
        {
        }

        [HttpGet]
        [Route("api/v2/ExternalCodes")]
        public HttpResponseMessage Get()
        {
            [ ... ]
        }

        [HttpGet]
        [Route("api/v2/ExternalCodes")]
        public HttpResponseMessage Get(
            byte? codeLevel,
            int batchId,
            int? lineId,
            int productId,
            string startingCode,
            int? quantity)
        {
            [ ... ]
        }
    }
}

但是,当我使用这个 URI:http://myHost:53827/api/v2/ExternalCodes?codeLevel=&batchId=5&lineId=&productId=7&startingCode=&quantity= 执行 GET 时,我得到一个 NotFound HTTP 状态代码。但我也用相同的状态码测试了这个 URI:http://myHost:53827/api/v2/ExternalCodes

我做错了什么?

我的WebApiConfig.cs 是:

namespace MyProject.Web.API
{
    /// <summary>
    /// Class to config Web API routes and filters.
    /// </summary>
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Json configuration
            var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
            // Remove formatting to make json smaller.
            json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None; 

            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // Filters.
            config.Filters.Add(new ExceptionFilter());
            config.Filters.Add(new UnhandledExceptionFilter());
        }
    }
}

【问题讨论】:

  • 你的路由配置是什么样的?你有默认路由(以及属性路由)
  • @Alex 我已经用 WebApiConfig 文件编辑了我的问题。
  • 尝试注释掉“DefaultApi”路由注册(基于约定的路由)...只是想看看是否有效
  • 不,它不起作用。
  • @VansFannel 我将您的类添加到我拥有的现有项目中,编译,然后使用提供的 url 调用操作,仅更改端口号。动作方法被调用!我不知道你有什么问题,但我不相信它在你的控制器或你的路由属性中。我确实使用了 uri localhost:6137/api/v2/…

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


【解决方案1】:

这实际上发生在我身上。这是由于在根 'Controllers' 文件夹中有两个同名的控制器,而不管子目录和命名空间如何(这种行为在区域内是不同的)。尝试将控制器重命名为:

ExternalCodesV1Controller

ExternalCodesV2Controller

您应该能够保持命名空间甚至属性路由相同。

【讨论】:

    【解决方案2】:

    一个令人讨厌的解决方案供您参考。这个想法是将默认控制器选择器更改为您的自定义选择器。

    文件“ValuesController.cs”:

    namespace WebApplication4.Controllers
    {
        public class ValuesController : ApiController
        {
            public IEnumerable<string> Get()
            {
                return new string[] { "value1", "value2" };
            }        
        }
    }
    

    文件“ValuesV2Controller.cs”:

    namespace WebApplication4.Controllers.V2
    {    
        public class ValuesController : ApiController
        {
    
            public IEnumerable<string> Get()
            {
                return new string[] { "value3", "value4" };
            }
        }
    }
    

    创建自定义控制器选择器:

    public class MyHttpControllerSelector : DefaultHttpControllerSelector
        {
            private HttpConfiguration _config;
    
            public MyHttpControllerSelector(HttpConfiguration configuration) : base(configuration)
            {
                _config = configuration;
            }
    
            public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
            {
                var routeData = request.GetRouteData();
                var routeTemplate = routeData.Route.RouteTemplate;
                if (routeTemplate.IndexOf("v2/values") != -1)
                {
                    return new HttpControllerDescriptor(
                        _config, "Values", 
                        typeof(WebApplication4.Controllers.V2.ValuesController));
                } else if (routeTemplate.IndexOf("values") != -1)
                {
                    return new HttpControllerDescriptor(
                        _config, "Values",
                        typeof(WebApplication4.Controllers.ValuesController));
                }
                return base.SelectController(request);
            }
        }
    

    在文件'WebApiConfig.cs'中注册自定义控制器选择器:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
                // Configure Web API to use only bearer token authentication.
                config.SuppressDefaultHostAuthentication();
                config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    
                // Web API routes
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "route1",
                    routeTemplate: "values"
                    );
    
                config.Routes.MapHttpRoute(
                    name: "route2",
                    routeTemplate: "v2/values");
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );          
    
                config.Services.Replace(
                    typeof(IHttpControllerSelector), 
                    new MyHttpControllerSelector(config));
            }
        }
    

    所以当你使用 'http://localhost:13839/values' 之类的 url 时,你会得到 value1 和 value2。以及 url 'http://localhost:13839/v2/values' 的 value3 和 value4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多