Mvc Web工程中加入Web Api后,Web Api接口无法访问

在VS2015中,将WebAPI整合到已有的MVC工程中,作者遇到了401未经授权的错误。问题出在路由配置上,通过对比新创建的包含MVC和API的工程,作者发现WebAPI的配置应该在`RouteConfig.RegisterRoutes`之前。调整后,页面和API都能正常访问。
摘要由CSDN通过智能技术生成

用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也可以正常访问了

终于成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值