我有一个ASP.NET Web应用程序项目,我实现了一个WebApi控制器,现在继续使用MVC控制器。
我添加了一个新的MVC控制器(例如“Test”)并选择将其添加为“空读写操作”。
使用各种CRUD方法创建控制器,但Index
操作的行为意外。
默认情况下,Index
操作不带任何参数:
public ActionResult Index()
{
return View();
}
现在,如果我尝试使用url“/Test/Index
”调用此方法,则不会调用该方法。
但是,如果我输入网址“/Test/Index/1
”,则会运行Index
操作。
在我看来它与路由有关所以我检查了RouteConfig
类看起来像:
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 }
);
}
Id
设置为可选,我的理解是我不应该要求在Index方法中提供参数值吗?
我创建了另一个项目并检查了这个行为,它运行正常。
所以想知道这个项目中MVC控制器的行为有何不同?
将WebApi控制器与MVC控制器混合有一些副作用(使其成为一种特殊情况)?
如果您需要任何信息来回答这个问题,请告诉我。
更新
我确实修改了WebApiConfig,以便根据我的要求使API控制器工作,它看起来像这样:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}",
defaults: new { controller = "iclock", action = "cdata" }
);
}
我无法理解为什么它会影响MVC控制器路由?我现在得到了答案。
更新2:
在这种情况下的问题是我不能(或者我可以?)在web api路由中为api加前缀,因为第三方设备正在使用固定的URL发送GET和POST请求,如下所示:
GET /iclock/cdata?SN=xxxxxx&options=all&pushver=2.0.2&language=XX
GET /iclock/cdata?SN=xxxxxx&type=time
POST /iclock/cdata?SN=123456&table=ATTLOG&Stamp=2011-04-05T17:40:20
我实现了上述请求处理功能,对WebApiConfig路由进行了更改。现在需要一个前端UI,我正在使用CRUD操作开发MVC控制器。
在这种情况下,理想的方法应该是什么?
答案 0 :(得分:3)
当您导航到测试/索引时,它可能不知道是否应该使用具有可选“id”的web路由或没有“id”的api路由。如果可能的话,我会为您的Web API路由添加前缀,例如MVC Web API模板中描述的“api / {controller} / {action}”。
对于您的第二个示例,访问API的应用程序将简单地在URL前面添加“api /”。如果他们使用您指定的URL并且无法更改,那么我认为您可能会被卡住,因为当请求进入时仍然存在不知道使用哪条路线的问题。
如果可以更改URL,如上所述,使用“api /".
的简单前缀编辑:根据提供的额外信息/代码段更新了我的答案。 编辑:再次更新
答案 1 :(得分:1)
您是否在WebApiConfig
RouteConfig
而不是 App_Start
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
答案 2 :(得分:1)
您的路由表中存在冲突。您的Web API路由表现在与标准MVC路由表相同。您的Web API路由表(使用MapHttpRoute初始化的表应该声明为:routeTemplate: "api/{controller}/{id}"
。此外,您不应该修改Web API路由。它不是一成不变的,它必须是{{1但是,你应该遵循一定的约定。尝试重置你的路线,如下所示,然后再试一次:
api/{controller}/{id}
因此,首先重置为正常路由配置并进行测试。之后,慢慢改变并遵循结果。