用vs2015 C#建立了一个web mvc工程,实现了一些简单的功能,包括对后台数据库的访问,添加、修改数据等普通功能,其中有好几个controller,比如用户管理、任务添加修改等。
现在需要允许第三方链接过来进行登录,在完成登录后,需要调用本工程中的一个web api对登录时生成的安全码进行校验,这是第三方平台为了安全控制而做的。为了添加web api,就在工程的controller上点右键,选择添加控制器,在模板中选择“Web API 2 控制器 - 空”,输入新控制器名称 CheckUser 后点确定进行创建,创建出来的类名:
public class CheckUserController : ApiController
添加一个get接口:
public string GetCheckUser(string safecode)
{
return "ok";
}
上面点击“确定”添加文件之后,会自动打开一个临时文件readme.txt,提示需要进行一些修改,根据提示,对Globael.asax.cs进行了修改:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// 这一行就是根据提示为web api添加的
GlobalConfiguration.Configure(WebApiConfig.Register);
}
加了最后一行。然后运行程序,在GetCheckUser()中加上断点,在ie里打开一个新页面,地址栏中输入:
http://localhost:41123/api/CheckUser?safecode=123
结果进不到断点,页面显示401错误,这有点奇怪了,我和之前一个单纯的web api工程的配置对比了一个,也没啥不对。拷贝一个原来工程中的web api文件到本工程中,修改namespace为本工程的,然后去访问它,结果一样,也是401错误,这样断定,应该是路由的问题了。先把Application_Start()中的两行可能有关的屏蔽掉:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// 这一行就是根据提示为web api添加的
GlobalConfiguration.Configure(WebApiConfig.Register);
}
再调动调试,这次主页面无法显示,不用管,仍然输入拷贝过来的api,结果成功,然后把屏蔽掉的两行逐个打开,最终发现是 RouteConfig.RegisterRoutes(RouteTable.Routes); 一行导致的,这下有点麻烦了。通过跟踪发现,这一行会调用 RouteConfig.cs中的RegisterRoutes()函数,这个函数如下(默认的,没有修改过):
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 }
);
}
把这里面的 routes.MapRoute() 调用屏蔽掉,再尝试访问api,也是成功的,说明就是这个路由导致的问题。但是这个屏蔽掉显然是不行的,因为屏蔽之后,页面就无法显示了,发愁。
还好我机灵,脑袋一转,有了。重新创建一个工程,这次把mvc、api都选上:
确定后随便输入个名字就行了,创建完成后,打开Global.asax.cs文件查看,发现也差不多,但还是有点不一样,如下是新工程的Global.asax.cs的启动函数:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
仔细观察发现,webapi的一行调用,是在第二行,其它的没啥区别,然后我的工程也一葫芦画瓢,把这一行的调用也移到第二行,然后再运行,页面可以正常访问,api也可以正常访问了
终于成功!