我对MVC框架比较陌生,但我确实有一个功能正常的Web项目,其API控制器利用了AttributeRouting(NuGet包) - 但是,我正在启动另一个项目,它只是不想遵循路由我把它放到了位置。
控制器:
public class BlazrController : ApiController
{
private readonly BlazrDBContext dbContext = null;
private readonly IAuthProvider authProvider = null;
public const String HEADER_APIKEY = "apikey";
public const String HEADER_USERNAME = "username";
private Boolean CheckSession()
{
IEnumerable<String> tmp = null;
List<String> apiKey = null;
List<String> userName = null;
if (!Request.Headers.TryGetValues(HEADER_APIKEY, out tmp)) return false;
apiKey = tmp.ToList();
if (!Request.Headers.TryGetValues(HEADER_USERNAME, out tmp)) return false;
userName = tmp.ToList();
for (int i = 0; i < Math.Min(apiKey.Count(), userName.Count()); i++)
if (!authProvider.IsValidKey(userName[i], apiKey[i])) return false;
return true;
}
public BlazrController(BlazrDBContext db, IAuthProvider auth)
{
dbContext = db;
authProvider = auth;
}
[GET("/api/q/users")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
[GET("api/q/usersauth")]
public string GetAuth()
{
if (!CheckSession()) return "You are not authorized";
return "You are authorized";
}
}
AttributeRoutingConfig.cs
public static class AttributeRoutingConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
// See http://github.com/mccalltd/AttributeRouting/wiki for more options.
// To debug routes locally using the built in ASP.NET development server, go to /routes.axd
routes.MapAttributeRoutes();
}
public static void Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
的Global.asax.cs:
//注意:有关启用IIS6或IIS7经典模式的说明, //访问http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
当我尝试导航到/ api / q / users时 - 我收到404找不到错误。如果我将路由更改为“/ api / blazr / users” - 我收到有关多个操作的错误,而无法确定要采取的操作。
任何帮助都表示赞赏 - 我真的需要一个小小的推动来找出问题所在,不需要为我完全解决它(我需要学习!)
由于
修改
routes.axd:
api/{controller}/{id}
{resource}.axd/{*pathInfo}
{controller}/{action}/{id}
答案 0 :(得分:93)
您不仅需要在routes.MapMvcAttributeRoutes()
文件中调用App_Start\RouteConfig.cs
,而且必须在定义默认路由之前显示!我在此之前和忽略{resource}.axd{*pathInfo}
之后添加它。刚发现尝试让我的MVC 5网站正确使用属性路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);
}
答案 1 :(得分:33)
在App_Start / RoutesConfig.cs
中确保拨打以下代码:
routes.MapMvcAttributeRoutes();
答案 2 :(得分:6)
在nuGet包管理器中安装到您的项目中 Web API Web Host包
将此课程添加到文件夹app_start-&gt; WebApiConfig.cs(如果它不退出 - 创建):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes(); // pay attention to this method
//here you can map any mvc route
//config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{id}",
// defaults: new { id = RouteParameter.Optional }
//);
config.EnableSystemDiagnosticsTracing();
}
}
后 尝试将Global.asax配置更改为:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
P.S。
通过这篇文章看看,非常有用 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2欢呼声
答案 3 :(得分:3)
我来到这里寻找与RoutePrefix
相关的答案。经过一些测试,我发现只需添加一个
[RoutePrefix("MyPrefix")]
不使用后续的Route属性,例如
[Route("MyRoute")]
表示RoutePrefix被忽略。 Haack的routedebugger非常有助于确定:https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/
只需通过NuGet添加它,它将为您的appsettings添加一行,然后您的所有路线都显示在页面底部。强烈推荐任何路由问题。
最后,我的最终版本如下:
[RoutePrefix("Asset/AssetType")]
[Route("{action=index}/{id?}")]
答案 4 :(得分:2)
确保为AttributeRouting安装了NuGet包“WebApp API”。
答案 5 :(得分:0)
我今天遇到了这个问题,发现如果必须在操作上使用Route属性,那么我还必须在控制器上添加RoutePrefix属性。
控制器=>
[RoutePrefix("api/search")]
public class SearchController : ApiController
动作=>
[HttpGet]
[Route("suburbs")]
public IEnumerable<Model.Suburb> Suburbs([FromUri]string query = "")