MongoDB3.4 shell CRUD操作

來源:互聯網
上載者:User

標籤:應用程式   defaults   seo   

對於Asp.Net Web Forms應用來說,請求的Url都是對應一個具體的物理檔案(http://xxx.com/default.aspx)。這樣的Url與具體物理檔案緊密綁定在一起,帶來了諸多方便的局限:可讀性、SEO最佳化等。為瞭解決這些局限性,微軟引入了URL路由系統。下面通過一個Demo來剖析一下Asp.Net的路由系統。

建立一個空的WebForm應用程式,在Global.asax.cs檔案中加入如下代碼:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

public class Global : System.Web.HttpApplication    {        protected void Application_Start(object sender, EventArgs e)        {            //處理匹配的檔案            RouteTable.Routes.RouteExistingFiles = true;            //url預設值            RouteValueDictionary defaults = new RouteValueDictionary() { { "name", "wuwenmao" }, { "id", "001" } };            //路由約束            RouteValueDictionary constraints = new RouteValueDictionary() { { "name", @"\w{2,10}" }, { "id", @"\d{3}" } };            //與路由相關的值,但不參與路由是否匹配URL模式            RouteValueDictionary dataTokens = new RouteValueDictionary() { { "defaultName", "wuwenmao" }, { "defaultId", "001" } };            RouteTable.Routes.MapPageRoute("default", "employees/{name}/{id}", "~/Default.aspx", false, defaults, constraints, dataTokens);        }    }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

建立名為Default的WebForm頁面,頁面代碼如下:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>    <title></title></head><body>    <form id="form1" runat="server">        <h1>這是Default.aspx頁面</h1>    <div>            RouteData中Values:        <ul>            <% foreach (var value in RouteData.Values)                { %>            <li>                <%=value.Key %>=<%=value.Value %>            </li>            <%} %>        </ul>        RouteData中DataTokens:        <ul>            <% foreach (var value in RouteData.DataTokens)                { %>            <li>                <%=value.Key %>=<%=value.Value %>            </li>            <%} %>        </ul>    </div>    </form></body></html>

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

輸入路徑為一下三種,得到的結果都是一樣的:

http://localhost:2947/employees/wuwenmao/001

http://localhost:2947/employees/wuwenmao

http://localhost:2947/employees/

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214163333410-2067488418.png" style="border:none;height:auto;margin:0px;padding:0px;" />

原因是因為註冊路由的時候,為路由模板中的變數設定了預設值,所以當用以上三種url時是等效的。

回頭看Global檔案中,在註冊路由時還設定了一個變數:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214163838285-1776356528.png" style="border:none;height:auto;margin:0px;padding:0px;" />

這是使用正則規則限定了路由模板中變數的值,請求url中對應的變數值只有與正則匹配才能正確請求,否則返回404錯誤。如id值長度大於3時:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214164122707-1107978194.png" style="border:none;height:auto;margin:0px;padding:0px;" />

上面通過一個簡單的例子體驗了一下Asp.Net路由系統,下面我們通過翻看源碼來剖析一下Asp.Net路由系統的實現原理。

 

首先,我們Global檔案中使用以下語句註冊一個路由時,實際上是向全域路由表添加一個路由。

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214164901582-1207096860.png" style="border:none;height:auto;margin:0px;padding:0px;" />

通過Reflector工具,我們可以看到:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214165312722-1962205551.png" style="border:none;height:auto;margin:0px;padding:0px;" />

      現在有個問題,在註冊好路由之後,Asp.Net是如何使用路由系統的呢?實際上,Asp.Net路由系統是通過註冊一個HttpModule對象,由這個HttpModule對象實現針對請求進行攔截,然後動態映射到用於處理當前請求的HttpHandler對象中,最後通過HttpHandler對象對請求進行處理並響應。這個HttpModule實際上就是UrlRoutingModule,我們在啟動Asp.Net程式時,通過Global檔案中的Modules屬性可以驗證,從下面可以看到,Modules屬性中包含了已經註冊的HttpModule,其中就包含UrlRoutingModule:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214172625629-734507210.png" style="border:none;height:auto;margin:0px;padding:0px;" />

 

 

在這個UrlRoutingModule裡面,又進行了哪些跟路由相關的操作呢,我們還是繼續翻看源碼:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214171123050-1998022123.png" style="border:none;height:auto;margin:0px;padding:0px;" />

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170214171250550-1762176555.png" style="border:none;height:auto;margin:0px;padding:0px;" />

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170215085919754-441033997.png" style="border:none;height:auto;margin:0px;padding:0px;" />

      通過上面的源碼查看,我們可以看出,當有請求來到時,Asp.Net通過註冊的UrlRoutingModule模組攔截了請求,然後從全域路由表中尋找匹配的RouteData,如果找得到,根據HttpApplication擷取到對應的HttpHandler,然後將其映射到當前請求上下文中,供後續的管道事件用以處理當前請求。

      下面我們繼續翻看源碼,剖析一下UrlRoutingModule是怎麼從全域路由表中擷取RouteData的:

 650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170215091340285-1798550042.png" style="border:none;height:auto;margin:0px;padding:0px;" />

從上面可以看到,UrlRoutingModule中調用全域路由表的GetRouteData,實際上是依次調用註冊的每個Route的GetRouteData,返回第一個匹配的RouteData,如果註冊的路由都不匹配,返回null。

下面我們再來看看Route裡面的GetRouteData做了些什麼:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170215092558066-1895291496.png" style="border:none;height:auto;margin:0px;padding:0px;" />

Match方法:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170215093044847-1112160679.png" style="border:none;height:auto;margin:0px;padding:0px;" />

650) this.width=650;" src="http://images2015.cnblogs.com/blog/1002347/201702/1002347-20170215093109707-1243607066.png" style="border:none;height:auto;margin:0px;padding:0px;" />

通過依次調用Route的GetRouteData方法,在GetRouteData方法中做了如下操作:

1、調用了ParsedRoute類型的Match方法進行請求Url和註冊在當前Route對象中的路由模板的匹配工作,如果沒有匹配,直接返回null;

2、如果請求Url和當前Route對象的路由模板匹配了,常見RouteData對象;

3、根據註冊路由資訊時定義的約束條件來檢驗當前請求Url是否通過,不通過返回null;

4、為RouteData對象的Values和DataTokens賦值操作;

5、返回RouteData對象;

到此,Asp.Net的路由系統基本上剖析完畢,還有很多細節限於篇幅沒辦法一一剖析。

總結:

      通過以上的剖析,我們整理一下思路,對Asp.Net路由系統所做的工作做個總結:首先,我們在Global中註冊了Route對象,然後通過在Asp.Net註冊的HttpModule模組UrlRoutingModule進行攔截請求Url,之後從全域路由表RouteTables.Routes中依次調用Route對象的GetRouteData進行請求Url和註冊路由資訊的匹配,返回第一個匹配的RouteData,尋找完整個RouteTables.Routes後沒有匹配到,返回null,最終會返回404給前端頁面


MongoDB3.4 shell CRUD操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.