需求背景
某項目需要通過WebAPI提供GIS接口服務。開發完成,部署到客戶機後,客戶又提出,不希望人們能夠通過IP+端口号的方式直接通路到接口服務網站,以免直接在接口頁面進行測試或操作,導緻資料安全方面的問題。
比如,接口部署好後,通過浏覽器中輸入IP和端口,可以通路到接口服務網站:
并可以進一步通路接口資訊:
而客戶希望看到的效果是,無論直接輸入IP加端口,還是進一步通路接口頁面,都能傳回一個空白頁面,或者至少不會看到現有頁面上的資訊,達到隐藏首頁的目的,而又不影響接口調用。
架構研究
WebAPI是基于MVC模型的一個架構,我們所能看到的,屬于View的部分。這部分的樣式頁面,通過WebAPI架構動态加載出來。如果要隐藏掉預設首頁,至少有兩個思路:一是直接修改頁面内容或禁止其加載,二是每當加載頁面時自動跳轉到空白頁面。為了友善接口測試和調用,我們拟采用後一種思路解決問題。
首頁和API頁采用了相同的頁面布局,我們發現,其布局檔案位于\Views\Shared\_Layout.cshtml檔案中。于是,思路很明确,在該頁面中加入自動跳轉到空白頁面的方法即可。
我們先在該項目中加入一個空白的靜态html頁面,命名為blank.html。在_Layout.cshtml中,可以直接寫C#代碼進行跳轉。
功能實作
原來的布局檔案部分代碼截取如下:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
可以看到,以@開頭的部分為C#代碼,可以直接執行。
我們在其中加入自動跳轉到空白頁面的代碼後,如下:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
@{
Response.Redirect("blank.html", false);
}
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
同時,blank.html的body部分,我們加入一段文字,來進行測試。
編譯,執行,在浏覽器中鍵入IP加端口,發現已自動跳轉到blank頁面,添加/help想檢視接口頁面時,也自動跳轉,原因在于二者使用相同的布局檔案。效果如下:
與此同時,接口的調用是不受影響的:
思維擴充
- 如果要跳轉到其他指定頁面,隻需修改跳轉頁面的實際位址即可,比如可以跳轉到百度搜尋、hao123導航、客戶機關官網等
- 該更新隻新增一個html檔案及修改少量代碼,重新修改後,不需全部重新部署,而隻要更新相應的修改檔案即可,非常友善
- 如果需要看到接口位址和進行接口測試,隻需要使用雙斜杠屏蔽跳轉的那一行C#代碼即可,當然,也可删除跳轉代碼