如何处理asp.net的webapi项目的测试环境与生产环境的help页面可见/不可见问题。
2017-05-10 16:11
1131 查看
预备知识:
asp.net下的webapi网站项目的一定了解
程序开发中条件编译的概念 以及 Visual Studio项目中条件编译的用法
理解这两个基本知识即可。
问题描述:
现在我们有一个webapi站点(简单点,就拿VS自带的框架生成一个默认的),显然地,运行此webapi站点,会得到这样的一个网站,此时网站首页如图1,help页如图2,图3.
这几个页面的含义应该不用太多介绍,总之就是列出接口名称、参数形式、返回值形式、请求示例这样的,便于开发者参考而已。
至于真实的接口地址,则是类似于 http://xxx.com/api/MemberBusinessModel/method1?key={key} 这样的形式。
以上是基本常识,都很容易理解。
现在问题来了,在开发时,我们当然希望如上3图中的信息能够看到,这样在开发中可以省去很多不必要的沟通,调用者直接看帮助页列出的接口列表,然后直接调用即可。
但是当要部署到生产环境时,有时我们不希望别人能够看到这些接口列表等信息,希望访问帮助页的时候服务器能够区分,然后直接重定向到404页面等。
这要怎么办呢?
-----------
为了解决这个问题,想过几种方法,简单描述:
1. 写一套验证授权机制(此方法成本最大,也最蠢)。
访问这些页面时有登录等行为,用户名和密码测试环境的我们自己知道。线上别人访问的话就不知道,也就无法登录,也就无法看到接口列表等信息。
具体实现不说了,意义不大。
2. 投机一点,行之有效,简单粗暴的办法(最容易理解,最容易实现)
将如下图所示的Areas文件夹右键选中,排除出项目,然后编译。这里面是帮助页相关的信息,与api接口调用并无关系,因此不会出问题。
但当试图访问帮助页时,显然都是看不到的,能看到的只是一个粗暴的报错页。
当然,如果觉得这个页面太不友好,那就发挥编码精神,将这样的错误页在web.config页面中,甚至在Controller中的Method的return view的时候指定到自己想要指定的页面,如自己写的404.html页面。
这样最容易理解,但问题就是测试环境和生产环境的代码其实已经不同的,至少有help中的HelpController.cs文件、HomeController.cs文件,.csproj文件等几处不同,总感觉有些不太好。
而且如果发布的时候用的依然是这份代码,难道还要再用vs打开,然后排除出项目,然后编译?这多麻烦。
结论:简单粗暴,易于理解,但测试环境与生产环境代码不一致,不是很好。
3. 通过条件编译的思路实现,稍有门槛,一劳永逸。
这也就是本文犹抱琵琶半遮面的内容。
重写http过滤器/拦截器什么的,拦截每一个发来的请求,如对api接口的请求,对help页面的访问请求等所有的
将此过滤器应用到HomeController的class或method上,应用到help页面的class上。
指定条件编译内容
从此即可保持代码一致。
以下是细节实现:
重写一个拦截器,随便放项目的什么地方,
2.分别将此拦截器应用到HomeController.cs上和HelpControlle.cs上。
3.如果help页面不需要了,则bundile.cs里的很多文件处理也不需要了的,也应该处理一下。
BundleConfig.cs
4.执行条件编译即可。
如下图,显然地,testV适用于测试环境,没有testV适用于生产环境。
如上图即完美完成。
asp.net下的webapi网站项目的一定了解
程序开发中条件编译的概念 以及 Visual Studio项目中条件编译的用法
理解这两个基本知识即可。
问题描述:
现在我们有一个webapi站点(简单点,就拿VS自带的框架生成一个默认的),显然地,运行此webapi站点,会得到这样的一个网站,此时网站首页如图1,help页如图2,图3.
这几个页面的含义应该不用太多介绍,总之就是列出接口名称、参数形式、返回值形式、请求示例这样的,便于开发者参考而已。
至于真实的接口地址,则是类似于 http://xxx.com/api/MemberBusinessModel/method1?key={key} 这样的形式。
以上是基本常识,都很容易理解。
现在问题来了,在开发时,我们当然希望如上3图中的信息能够看到,这样在开发中可以省去很多不必要的沟通,调用者直接看帮助页列出的接口列表,然后直接调用即可。
但是当要部署到生产环境时,有时我们不希望别人能够看到这些接口列表等信息,希望访问帮助页的时候服务器能够区分,然后直接重定向到404页面等。
这要怎么办呢?
-----------
为了解决这个问题,想过几种方法,简单描述:
1. 写一套验证授权机制(此方法成本最大,也最蠢)。
访问这些页面时有登录等行为,用户名和密码测试环境的我们自己知道。线上别人访问的话就不知道,也就无法登录,也就无法看到接口列表等信息。
具体实现不说了,意义不大。
2. 投机一点,行之有效,简单粗暴的办法(最容易理解,最容易实现)
将如下图所示的Areas文件夹右键选中,排除出项目,然后编译。这里面是帮助页相关的信息,与api接口调用并无关系,因此不会出问题。
但当试图访问帮助页时,显然都是看不到的,能看到的只是一个粗暴的报错页。
当然,如果觉得这个页面太不友好,那就发挥编码精神,将这样的错误页在web.config页面中,甚至在Controller中的Method的return view的时候指定到自己想要指定的页面,如自己写的404.html页面。
这样最容易理解,但问题就是测试环境和生产环境的代码其实已经不同的,至少有help中的HelpController.cs文件、HomeController.cs文件,.csproj文件等几处不同,总感觉有些不太好。
而且如果发布的时候用的依然是这份代码,难道还要再用vs打开,然后排除出项目,然后编译?这多麻烦。
结论:简单粗暴,易于理解,但测试环境与生产环境代码不一致,不是很好。
3. 通过条件编译的思路实现,稍有门槛,一劳永逸。
这也就是本文犹抱琵琶半遮面的内容。
重写http过滤器/拦截器什么的,拦截每一个发来的请求,如对api接口的请求,对help页面的访问请求等所有的
将此过滤器应用到HomeController的class或method上,应用到help页面的class上。
指定条件编译内容
从此即可保持代码一致。
以下是细节实现:
重写一个拦截器,随便放项目的什么地方,
using System.Web.Mvc; namespace webApi.Util { public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //如果是在!testV条件下,则将一切请求(指的是应用了CustomAuthorize的控制器class或method)直接重定向到404页面;反之,执行默认行为 #if !testV filterContext.Result = new RedirectResult("~/404.html"); #endif } } }
2.分别将此拦截器应用到HomeController.cs上和HelpControlle.cs上。
using System.Web.Mvc; using webApi.Util; namespace webApi.Controllers { /// <summary> /// /// </summary> public class HomeController : Controller { /// <summary> /// /// </summary> /// <returns></returns> [CustomAuthorize] public ActionResult Index() { return View(); } } }
using System; using System.Web.Http; using System.Web.Mvc; using webApi.Areas.HelpPage.Models; using webApi.Util; namespace webApi.Areas.HelpPage.Controllers { /// <summary> /// The controller that will handle requests for the help page. /// </summary> [CustomAuthorize] public class HelpController : Controller { //略 } }
3.如果help页面不需要了,则bundile.cs里的很多文件处理也不需要了的,也应该处理一下。
BundleConfig.cs
using System.Web; using System.Web.Optimization; namespace webApi { public class BundleConfig { // 有关 Bundling 的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=254725 public static void RegisterBundles(BundleCollection bundles) { //如果是在testV条件下,则执行这些bundles行为;如果不是testV,则相当于这部分代码就不存在 #if testV bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/OriginalJs/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include("~/Scripts/OriginalJs/jquery-ui-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/OriginalJs/jquery.unobtrusive*", "~/Scripts/OriginalJs/jquery.validate*")); // 略 #endif } } }
4.执行条件编译即可。
如下图,显然地,testV适用于测试环境,没有testV适用于生产环境。
如上图即完美完成。
相关文章推荐
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- 关于如何从多个项目创建 ASP.NET 应用程序以进行组开发问题
- 为解决ASP.NET MVC(CTP)中URL“页面请求”和“单纯逻辑处理请求”混淆问题,提供一条思路
- win7+iis7 配置asp.net环境下的问题(2):由于扩展配置问题而无法提供您请求的页面。
- asp.net 开发 跬步篇〔1〕_ajax web页面复杂处理延时、客户交互问题
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- ASP.NET页面提前处理问题
- 生产环境中部署asp.net mvc项目实战
- 【Asp.Net】:如何处理大量页面的身份验证跳转
- 如何使用 asp.net 4.0 新特性 路由功能 有助于seo优化 给一个 asp.net web项目(网站项目) 增加路由功能 ,继承,给根据路由生成的url的结尾,增加一个有利于seo优化的斜杠 /,跳转到一个路由生成的url页面
- 对ASP.NET如何处理页面的理解
- 如何避免asp.net中的页面闪动问题!
- ASP.NET页面提前处理问题
- Asp.net如何在Web页面上直接打开、编辑、创建Office文档的问题
- asp.net高级反射,动态生成的bean如何处理赋值问题?
- ASP.NET中的路径问题如何处理
- 对于长时间装载的ASP.NET页面如何在客户端浏览器中显示进度?(测试成功)
- asp.net 项目中部分html页面,在浏览器里中文变乱码问题
- 如何打开没有*.sln工程文件的asp.net网站项目以及各种.net环境的项目
- Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]