{"id":1058,"date":"2025-05-21T20:25:05","date_gmt":"2025-05-21T12:25:05","guid":{"rendered":"https:\/\/www.hyy.net\/?p=1058"},"modified":"2025-05-21T20:25:05","modified_gmt":"2025-05-21T12:25:05","slug":"asp-net-core-razor-pages-in-action-2-%e6%9e%84%e5%bb%ba%e6%82%a8%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f","status":"publish","type":"post","link":"https:\/\/diji.net\/?p=1058","title":{"rendered":"ASP.NET Core Razor Pages in Action 2 \u6784\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f"},"content":{"rendered":"<p>ASP.NET Core Razor Pages in Action 2 \u6784\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f<\/p>\n<h2>\u672c\u7ae0\u6db5\u76d6<\/h2>\n<p>\u2022  \u521b\u5efa Razor Pages \u5e94\u7528\u7a0b\u5e8f<br \/>\n\u2022  \u6dfb\u52a0\u60a8\u7684\u7b2c\u4e00\u4e2a\u9875\u9762<br \/>\n\u2022  \u63a2\u7d22\u9879\u76ee\u6587\u4ef6\u53ca\u5176\u6240\u626e\u6f14\u7684\u89d2\u8272<br \/>\n\u2022  \u4f7f\u7528\u4e2d\u95f4\u4ef6\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u7ba1\u9053<\/p>\n<p>\u5728\u4e0a\u4e00\u7ae0\u4e2d\uff0c\u4f60\u4e86\u89e3\u4e86 Razor Pages Web \u5f00\u53d1\u6846\u67b6\uff08\u4f5c\u4e3a ASP.NET Core \u7684\u4e00\u90e8\u5206\uff09\u5982\u4f55\u9002\u5e94\u6574\u4e2a .NET Framework\u3002\u60a8\u5df2\u7ecf\u53d1\u73b0\u4e86\u53ef\u4ee5\u4f7f\u7528 Razor Pages \u6784\u5efa\u7684\u5e94\u7528\u7a0b\u5e8f\u7c7b\u578b\uff0c\u800c\u4e14\u91cd\u8981\u7684\u662f\uff0c\u5f53\u5b83\u4e0d\u662f\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u65f6\u3002\u60a8\u5df2\u7ecf\u4e86\u89e3\u4e86\u4f7f\u7528 Razor Pages \u9ad8\u6548\u5de5\u4f5c\u6240\u9700\u7684\u5de5\u5177\uff0c\u5e76\u5e0c\u671b\u4e0b\u8f7d\u5e76\u5b89\u88c5\u4e86 Visual Studio \u6216 VS Code \u4ee5\u53ca\u6700\u65b0\u7248\u672c\u7684 .NET SDK\u3002\u73b0\u5728\u60a8\u5df2\u7ecf\u8bbe\u7f6e\u4e86\u5f00\u53d1\u73af\u5883\uff0c\u662f\u65f6\u5019\u5f00\u59cb\u4f7f\u7528\u4ee3\u7801\u4e86\u3002<\/p>\n<p>\u5728\u672c\u7ae0\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528 Visual Studio \u548c CLI \u521b\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a Razor Pages \u5e94\u7528\u7a0b\u5e8f\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5728\u6240\u9009\u7684\u4f5c\u7cfb\u7edf\u4e0a\u8fdb\u884c\u4f5c\u3002\u5927\u591a\u6570 Web \u5f00\u53d1\u6846\u67b6\u90fd\u63d0\u4f9b\u521d\u5b66\u8005\u5de5\u5177\u5305\u6216\u9879\u76ee \u2014 \u4e00\u4e2a\u7b80\u5355\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u6784\u6210\u60a8\u81ea\u5df1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u8d77\u70b9\u3002Razor Pages \u4e5f\u4e0d\u4f8b\u5916\u3002\u6784\u6210\u521d\u5b66\u8005\u5de5\u5177\u5305\u7684\u5e94\u7528\u7a0b\u5e8f\u53ea\u6709\u4e09\u4e2a\u9875\u9762\uff0c\u4f46\u5b83\u5305\u62ec\u4e00\u4e2a\u57fa\u672c\u914d\u7f6e\uff0c\u60a8\u53ef\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u4ee5\u521b\u5efa\u81ea\u5df1\u7684\u66f4\u590d\u6742\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u5e76\u8bbe\u6cd5\u5728\u6d4f\u89c8\u5668\u4e2d\u542f\u52a8\u5b83\u540e\uff0c\u60a8\u5c06\u5411\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u65b0\u9875\u9762\u5e76\u5305\u542b\u4e00\u4e9b\u52a8\u6001\u5185\u5bb9\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5f00\u59cb\u4e86\u89e3 Razor \u9875\u9762\u7684\u5b9e\u9645\u542b\u4e49\u3002\u6d4b\u8bd5\u9875\u9762\u4ee5\u786e\u4fdd\u5176\u6b63\u5e38\u5de5\u4f5c\u540e\uff0c\u60a8\u5c06\u4f7f\u7528\u7f51\u7ad9\u7684\u4e3b\u6a21\u677f\u6587\u4ef6\u5c06\u9875\u9762\u6dfb\u52a0\u5230\u7f51\u7ad9\u5bfc\u822a\u4e2d\u3002<\/p>\n<p>\u7136\u540e\uff0c\u6211\u5c06\u8ba8\u8bba\u8be5\u5de5\u5177\u751f\u6210\u7684\u5e94\u7528\u7a0b\u5e8f\u6587\u4ef6\uff0c\u4ee5\u4e86\u89e3\u6bcf\u4e2a\u751f\u6210\u7684\u6587\u4ef6\u5728 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u4e2d\u6240\u626e\u6f14\u7684\u89d2\u8272\u3002\u672c\u6f14\u7ec3\u5c06\u5e2e\u52a9\u60a8\u4e86\u89e3\u6240\u6709 ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u80cc\u540e\u7684\u57fa\u7840\u77e5\u8bc6\u3002<\/p>\n<p>\u5728\u672c\u6f14\u7ec3\u7684\u6700\u540e\uff0c\u6211\u4eec\u5c06\u4ed4\u7ec6\u7814\u7a76\u4e3b\u8981\u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\uff1a\u8bf7\u6c42\u7ba1\u9053\u3002\u8fd9\u662f\u5e94\u7528\u7a0b\u5e8f\u7684\u6838\u5fc3\u3002\u5b83\u5b9a\u4e49\u5e94\u7528\u7a0b\u5e8f\u5982\u4f55\u5904\u7406\u8bf7\u6c42\u4ee5\u53ca\u5411\u5ba2\u6237\u7aef\u63d0\u4f9b\u54cd\u5e94\u3002\u60a8\u5c06\u4e86\u89e3\u5982\u4f55\u4ece\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u6784\u5efa\u5b83\uff0c\u4ee5\u53ca\u5982\u4f55\u901a\u8fc7\u6dfb\u52a0\u81ea\u5df1\u7684\u4e2d\u95f4\u4ef6\u6765\u6269\u5c55\u5b83\u3002<\/p>\n<p>\u5728\u672c\u7ae0\u7ed3\u675f\u65f6\uff0c\u60a8\u5e94\u8be5\u5bf9 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u7684\u5de5\u4f5c\u539f\u7406\u6709\u4e00\u4e2a\u5f88\u597d\u7684\u9ad8\u7ea7\u4e86\u89e3\uff0c\u4ece\u63a5\u6536\u8bf7\u6c42\u5230\u6700\u7ec8\u5c06 HTML \u53d1\u9001\u56de\u5ba2\u6237\u7aef\u3002\u7136\u540e\uff0c\u60a8\u5c06\u51c6\u5907\u597d\u5728\u7b2c 3 \u7ae0\u4e2d\u6df1\u5165\u63a2\u8ba8\u5982\u4f55\u4f7f\u7528 Razor \u9875\u9762\u53ca\u5176\u914d\u5957 PageModel \u7c7b\u3002<\/p>\n<h2>2.1 \u521b\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a\u7f51\u7ad9<\/h2>\n<p>\u672c\u90e8\u5206\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528\u53ef\u7528\u5de5\u5177\u5feb\u901f\u751f\u6210\u529f\u80fd\u9f50\u5168\u7684 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u5c06\u5728 Windows 10 \u4e0a\u4f7f\u7528 Visual Studio 2022 Community Edition\uff0c\u5e76\u4e3a\u975e Windows \u8bfb\u8005\u4f7f\u7528 CLI\u3002\u6211\u5c06\u8ba8\u8bba\u5728 Visual Studio Code \u4e2d\u4f7f\u7528 CLI\uff0c\u5c3d\u7ba1\u60a8\u53ef\u4ee5\u4f7f\u7528\u4efb\u4f55\u7ec8\u7aef\u5e94\u7528\u7a0b\u5e8f\u6765\u6267\u884c CLI \u547d\u4ee4\u3002\u56e0\u6b64\uff0c\u4ee5\u4e0b\u90e8\u5206\u5047\u5b9a\u60a8\u5df2\u5b89\u88c5\u5e76\u8fd0\u884c\u73af\u5883\uff0c\u4ee5\u53ca\u652f\u6301 .NET 6 \u5f00\u53d1\u7684 SDK \u7248\u672c\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u6253\u5f00\u547d\u4ee4 shell \u5e76\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u6d4b\u8bd5\u60a8\u7684\u673a\u5668\u4e0a\u662f\u5426\u5b89\u88c5\u4e86\u5408\u9002\u7684 SDK \u7248\u672c\uff1a<\/p>\n<pre><code>dotnet --list-sdks<\/code><\/pre>\n<p>\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u5217\u51fa\u4e86\u4e00\u4e2a\u6216\u591a\u4e2a\u7248\u672c\uff0c\u6bcf\u4e2a\u7248\u672c\u90fd\u6709\u81ea\u5df1\u7684\u5b89\u88c5\u8def\u5f84\u3002\u81f3\u5c11\u6709\u4e00\u4e2a\u7248\u672c\u5e94\u4ee5 6 \u5f00\u5934\u3002\u5728\u6b64\u9636\u6bb5\uff0c\u5982\u679c\u60a8\u662f\u7b2c\u4e00\u6b21\u4f7f\u7528\u7684\u7528\u6237\uff0c\u60a8\u8fd8\u9700\u8981\u4fe1\u4efb\u81ea\u7b7e\u540d\u8bc1\u4e66\uff0c\u8be5\u8bc1\u4e66\u662f\u5728\u672c\u5730\u7cfb\u7edf\u4e0a\u901a\u8fc7 HTTPS \u8f7b\u677e\u6d4f\u89c8\u7ad9\u70b9\u6240\u9700\u7684\uff08\u7b2c 14 \u7ae0\u4e2d\u6709\u66f4\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff09\u3002\u4e3a\u6b64\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre><code>dotnet dev-certs https --trust<\/code><\/pre>\n<p>\u8bc1\u4e66\u672c\u8eab\u4f5c\u4e3a SDK \u5b89\u88c5\u7684\u4e00\u90e8\u5206\u8fdb\u884c\u5b89\u88c5\u3002<\/p>\n<h3>2.1.1 \u4f7f\u7528 Visual Studio \u521b\u5efa\u7f51\u7ad9<\/h3>\n<p>\u5982\u7b2c 1 \u7ae0\u6240\u8ff0\uff0cVisual Studio \u662f\u5728 Windows \u4e0a\u5de5\u4f5c\u7684 .NET \u5f00\u53d1\u4eba\u5458\u7684\u4e3b\u8981 IDE\u3002\u5b83\u5305\u62ec\u7528\u4e8e\u6267\u884c\u6700\u5e38\u89c1\u4efb\u52a1\u7684\u7b80\u5355\u83dc\u5355\u9a71\u52a8\u5de5\u4f5c\u6d41\u3002Razor Pages \u5e94\u7528\u7a0b\u5e8f\u662f\u5728 Visual Studio \u4e2d\u521b\u5efa\u4e3a\u9879\u76ee\uff0c\u56e0\u6b64\u6253\u5f00 Visual Studio \u540e\uff0c\u60a8\u7684\u8d77\u70b9\u662f\u521b\u5efa\u65b0\u9879\u76ee\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5355\u51fb\u542f\u52a8\u542f\u52a8\u753b\u9762\u4e0a\u7684 Create a New Project \u6309\u94ae\u6216\u8f6c\u5230 File &gt; New Project...\u5728\u4e3b\u83dc\u5355\u680f\u4e2d\u3002<\/p>\n<p>\u5728\u4e0b\u4e00\u4e2a\u5c4f\u5e55\u4e0a\uff0c\u60a8\u53ef\u4ee5\u4ece\u6a21\u677f\u5217\u8868\u4e2d\u9009\u62e9\u8981\u521b\u5efa\u7684\u9879\u76ee\u7c7b\u578b\u3002\u5728\u6b64\u4e4b\u524d\uff0c\u6211\u5efa\u8bae\u4ece\u53f3\u4fa7\u7a97\u683c\u9876\u90e8\u7684\u8bed\u8a00\u9009\u62e9\u5668\u4e2d\u9009\u62e9 C# \u4ee5\u8fc7\u6ee4\u6389\u4e00\u4e9b\u5e72\u6270\u3002\u9009\u62e9 ASP.NET Core Web App \u6a21\u677f \u2014 \u540d\u79f0\u4e2d\u6ca1\u6709 \uff08Model-View-Controller\uff09 \u7684\u6a21\u677f\uff0c\u8fd8\u8981\u6ce8\u610f\u907f\u514d\u9009\u62e9\u540d\u79f0\u975e\u5e38\u76f8\u4f3c\u7684 ASP.NET Core Web API \u6a21\u677f\u3002\u6b63\u786e\u7684\u6a21\u677f\u5e26\u6709\u4ee5\u4e0b\u8bf4\u660e\uff1a\u201c\u7528\u4e8e\u521b\u5efa ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u7684\u9879\u76ee\u6a21\u677f\uff0c\u5176\u4e2d\u5305\u542b ASP.NET Razor Pages \u5185\u5bb9\u3002<\/p>\n<p>\u4e3a\u5e94\u7528\u7a0b\u5e8f\u6587\u4ef6\u9009\u62e9\u5408\u9002\u7684\u4f4d\u7f6e\u5e76\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5c4f\u5e55\u540e\uff0c\u8bf7\u786e\u4fdd\u60a8\u7684 Target Framework \u9009\u62e9\u662f .NET 6\uff0c\u5c06\u6240\u6709\u5176\u4ed6\u9009\u9879\u4fdd\u7559\u4e3a\u9ed8\u8ba4\u503c\u3002Authentication Type \u5e94\u8be5\u8bbe\u7f6e\u4e3a None\uff0c\u5e94\u8be5\u9009\u4e2d Configure for HTTPS\uff0c\u5e76\u4e14\u4f60\u5e94\u8be5\u53d6\u6d88\u9009\u4e2d Enable Docker \u9009\u9879\uff08\u56fe 2.1\uff09\u3002\u5bf9\u9009\u62e9\u611f\u5230\u6ee1\u610f\u540e\uff0c\u5355\u51fb Create \u6309\u94ae\u3002\u6b64\u65f6\uff0cVisual Studio \u5e94\u8be5\u4f1a\u6253\u5f00\uff0c\u5e76\u5728 Solution Explorer \u4e2d\u663e\u793a\u60a8\u7684\u65b0\u5e94\u7528\u7a0b\u5e8f\uff08\u56fe 2.2\uff09\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0201.png\"><\/p>\n<p>\u56fe 2.1 \u5728\u70b9\u51fb Create \u6309\u94ae\u4e4b\u524d\u68c0\u67e5\u60a8\u662f\u5426\u5df2\u5e94\u7528\u8fd9\u4e9b\u8bbe\u7f6e\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0202.png\"><\/p>\n<p>\u56fe 2.2 \u65b0\u5e94\u7528\u7a0b\u5e8f\u5c06\u5728 Visual Studio \u4e2d\u6253\u5f00\uff0c\u5176\u4e2d\u6709\u4e00\u4e2a\u6982\u8ff0\u9875\uff0c\u53f3\u4fa7\u6253\u5f00\u201c\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u7a97\u53e3\uff0c\u5176\u4e2d\u663e\u793a\u4e86 WebApplication1 \u89e3\u51b3\u65b9\u6848\u53ca\u5176\u5355\u4e2a\u9879\u76ee\uff08\u4e5f\u79f0\u4e3a WebApplication1\uff09\u7684\u7ed3\u6784\u548c\u5185\u5bb9\u3002<\/p>\n<p>\u5c3d\u7ba1 Solution Explorer \u7684\u5185\u5bb9\u770b\u8d77\u6765\u50cf\u6587\u4ef6\u7ed3\u6784\uff0c\u4f46\u5e76\u975e\u60a8\u770b\u5230\u7684\u6240\u6709\u9879\u5b9e\u9645\u4e0a\u90fd\u662f\u6587\u4ef6\u3002\u6211\u4eec\u5c06\u5728\u672c\u7ae0\u540e\u9762\u4ed4\u7ec6\u7814\u7a76\u8fd9\u4e9b\u9879\u76ee\u3002<\/p>\n<h3>2.1.2 \u4f7f\u7528\u547d\u4ee4\u884c\u754c\u9762\u521b\u5efa\u7f51\u7ad9<\/h3>\n<p>\u5982\u679c\u60a8\u5df2\u7ecf\u4f7f\u7528 Visual Studio \u6784\u5efa\u4e86\u5e94\u7528\u7a0b\u5e8f\uff0c\u5219\u53ef\u80fd\u9700\u8981\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002\u4f46\u662f\uff0c\u6211\u5efa\u8bae\u60a8\u4e5f\u5c1d\u8bd5\u8fd9\u79cd\u65b9\u6cd5\u6765\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8fc7\u7a0b\u4f1a\u63ed\u793a Visual Studio \u4e2d\u7684\u65b0\u9879\u76ee\u521b\u5efa\u5411\u5bfc\u9690\u85cf\u7684\u4e00\u4e24\u4e2a\u4ee4\u4eba\u5174\u594b\u7684\u4e8b\u60c5\u3002<\/p>\n<p>CLI \u662f\u4e00\u79cd\u57fa\u4e8e\u6587\u672c\u7684\u5de5\u5177\uff0c\u7528\u4e8e\u5bf9 dotnet.exe \u5de5\u5177\u6267\u884c\u547d\u4ee4\uff0c\u8fd9\u4e24\u8005\u90fd\u662f\u4f5c\u4e3a SDK \u7684\u4e00\u90e8\u5206\u5b89\u88c5\u7684\u3002CLI \u7684\u5165\u53e3\u70b9\u662f dotnet \u547d\u4ee4\uff0c\u7528\u4e8e\u6267\u884c .NET SDK \u547d\u4ee4\u548c\u8fd0\u884c .NET \u5e94\u7528\u7a0b\u5e8f\u3002\u5728\u63a5\u4e0b\u6765\u7684\u90e8\u5206\u4e2d\uff0c\u60a8\u5c06\u5c06\u5176\u7528\u4e8e\u7b2c\u4e00\u4e2a\u76ee\u7684\u3002SDK \u7684\u9ed8\u8ba4\u5b89\u88c5\u4f1a\u5c06 dotnet \u5de5\u5177\u6dfb\u52a0\u5230\u60a8\u7684 PATH \u53d8\u91cf\u4e2d\uff0c\u56e0\u6b64\u60a8\u53ef\u4ee5\u4ece\u7cfb\u7edf\u4e0a\u7684\u4efb\u4f55\u4f4d\u7f6e\u5bf9\u5b83\u6267\u884c\u547d\u4ee4\u3002<\/p>\n<p>\u53ef\u4ee5\u4f7f\u7528\u60a8\u559c\u6b22\u7684\u4efb\u4f55\u547d\u4ee4 shell \u8c03\u7528 CLI \u5de5\u5177\uff0c\u5305\u62ec Windows \u547d\u4ee4\u63d0\u793a\u7b26\u3001Bash\u3001\u7ec8\u7aef\u6216 PowerShell\uff08\u6709\u8de8\u5e73\u53f0\u7248\u672c\uff09\u3002\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6211\u5c06 shell \u79f0\u4e3a\u7ec8\u7aef\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a\u5b83\u5728 VS Code \u4e2d\u547d\u540d\u3002\u4ee5\u4e0b\u6b65\u9aa4\u5e76\u4e0d\u5047\u5b9a\u60a8\u4f7f\u7528 VS Code \u6267\u884c\u547d\u4ee4\uff0c\u4f46\u60a8\u53ef\u4ee5\u4f7f\u7528 VS Code \u63d0\u4f9b\u7684\u96c6\u6210\u7ec8\u7aef\u6765\u6267\u884c\u547d\u4ee4\u3002<\/p>\n<p>\u9996\u5148\uff0c\u5728\u7cfb\u7edf\u4e0a\u7684\u9002\u5f53\u4f4d\u7f6e\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a WebApplication1 \u7684\u6587\u4ef6\u5939\uff0c\u7136\u540e\u4f7f\u7528\u7ec8\u7aef\u5bfc\u822a\u5230\u8be5\u6587\u4ef6\u5939\uff0c\u6216\u5728 VS Code \u4e2d\u6253\u5f00\u8be5\u6587\u4ef6\u5939\u3002\u5982\u679c\u60a8\u9009\u62e9\u4f7f\u7528 VS Code\uff0c\u5219\u53ef\u4ee5\u901a\u8fc7\u6309 Ctrl-' \u8bbf\u95ee\u7ec8\u7aef\u3002\u5728\u547d\u4ee4\u63d0\u793a\u7b26\u4e0b\uff0c\u952e\u5165\u4ee5\u4e0b\u547d\u4ee4\uff0c\u5e76\u5728\u6bcf\u4e2a\u547d\u4ee4\u540e\u6309 Enter \u952e\u3002<\/p>\n<p>\u5217\u8868 2.1 \u4f7f\u7528 CLI \u521b\u5efa Razor Pages \u5e94\u7528\u7a0b\u5e8f<\/p>\n<pre><code>dotnet new sln                                           \u2776\ndotnet new webapp -o WebApplication1                     \u2777\ndotnet sln add WebApplication1\\WebApplication1.csproj    \u2778<\/code><\/pre>\n<p>\u2776 \u521b\u5efa\u89e3\u51b3\u65b9\u6848\u6587\u4ef6<br \/>\n\u2777 \u642d\u5efa\u65b0\u7684 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u57fa\u67b6\uff0c\u5e76\u5c06\u8f93\u51fa\u653e\u5165\u540d\u4e3a WebApplication1 \u7684\u5b50\u6587\u4ef6\u5939\u4e2d<br \/>\n\u2778 \u5c06 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u5230\u89e3\u51b3\u65b9\u6848<\/p>\n<p>\u6267\u884c\u6700\u540e\u4e00\u4e2a\u547d\u4ee4\u540e\uff0c\u6240\u6709\u5e94\u7528\u7a0b\u5e8f\u6587\u4ef6\u90fd\u5e94\u8be5\u6210\u529f\u521b\u5efa\u3002\u60a8\u8fd8\u5e94\u8be5\u4ece\u7ec8\u7aef\u83b7\u5f97\u4e00\u4e9b\u4e0e\u67d0\u4e9b \u201cpost-creation actions\u201d \u76f8\u5173\u7684\u53cd\u9988\u3002\u60a8\u5230 WebApplication1 \u7684\u8def\u5f84\u53ef\u80fd\u4e0e\u6211\u7684\u8def\u5f84\u5927\u4e0d\u76f8\u540c\uff0c\u5982\u4e0b\u9762\u7684\u6e05\u5355\u6240\u793a\uff0c\u4f46\u5176\u4f59\u7684\u53cd\u9988\u5e94\u8be5\u76f8\u4f3c\u3002<\/p>\n<p>\u5217\u8868 2.2 CLI \u6267\u884c\u7684\u521b\u5efa\u540e\u4f5c\u7684\u901a\u77e5<\/p>\n<pre><code>Processing post-creation actions...\nRunning &#039;dotnet restore&#039; on WebApplication1\\WebApplication1.csproj...\n  Determining projects to restore...\n  Restored D:\\MyApps\\WebApplication1\\WebApplication1\\WebApplication1.csproj \n(in 80 ms).\nRestore succeeded.<\/code><\/pre>\n<p>CLI \u5728\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u4e0a\u6267\u884c dotnet restore \u547d\u4ee4\uff0c\u786e\u4fdd\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u6240\u4f9d\u8d56\u7684\u6240\u6709\u8f6f\u4ef6\u5305\u90fd\u5df2\u83b7\u53d6\u4e14\u662f\u6700\u65b0\u7684\u3002\u5982\u679c\u4f7f\u7528 Visual Studio \u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\uff0c\u5c06\u6267\u884c\u76f8\u540c\u7684\u547d\u4ee4\uff0c\u4f46\u6307\u793a\u5b83\u5df2\u53d1\u751f\u5e76\u4e0d\u90a3\u4e48\u660e\u663e\u3002\u5b83\u663e\u793a\u5728 IDE \u5e95\u90e8\u7684\u72b6\u6001\u680f\u4e2d\uff08\u56fe 2.3\uff09\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0203.png\"><\/p>\n<p>\u56fe 2.3 Visual Studio \u5e95\u90e8\u7684\u72b6\u6001\u680f\u663e\u793a\u9879\u76ee\u5df2\u6062\u590d\u3002<\/p>\n<h3>2.1.3 \u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f<\/h3>\n<p>\u73b0\u5728\uff0c\u5e94\u7528\u7a0b\u5e8f\u5df2\u4f7f\u7528\u60a8\u9009\u62e9\u7684\u4efb\u4f55\u65b9\u5f0f\u521b\u5efa\uff0c\u60a8\u53ef\u4ee5\u5728\u6d4f\u89c8\u5668\u4e2d\u8fd0\u884c\u548c\u67e5\u770b\u5b83\u3002\u8981\u4ece Visual Studio \u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\uff0c\u60a8\u53ea\u9700\u6309 Ctrl-F5 \u6216\u5355\u51fb\u9876\u90e8\u83dc\u5355\u680f\u4e2d\u8f6e\u5ed3\u7684\u7eff\u8272\u4e09\u89d2\u5f62\uff08\u4e0d\u662f\u5b9e\u5fc3\u4e09\u89d2\u5f62\uff09\u3002\u8fd9\u5c06\u8d1f\u8d23\u6784\u5efa\u548c\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\uff0c\u4ee5\u53ca\u5728\u6d4f\u89c8\u5668\u4e2d\u542f\u52a8\u5b83\u3002\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662f CLI\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre><code>dotnet run --project WebApplication1\\WebApplication1.csproj<\/code><\/pre>\n<p>\u6b64\u547d\u4ee4\u5305\u62ec --project \u5f00\u5173\uff0c\u7528\u4e8e\u6307\u5b9a\u9879\u76ee\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u5982\u679c\u4ece\u5305\u542b csproj \u6587\u4ef6\u7684\u6587\u4ef6\u5939\u4e2d\u6267\u884c\u547d\u4ee4\uff0c\u5219\u7701\u7565 --project \u5f00\u5173\u3002\u5982\u679c\u60a8\u66f4\u559c\u6b22\u5728 Visual Studio \u4e2d\u4f7f\u7528 CLI\uff0c\u8bf7\u6309 Ctrl-' \u6253\u5f00\u96c6\u6210\u7ec8\u7aef\uff0c\u7136\u540e\u4ece\u5185\u90e8\u6267\u884c\u547d\u4ee4\u3002<\/p>\n<p>\u60a8\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u6536\u5230\u6b63\u5728\u6784\u5efa\u5e94\u7528\u7a0b\u5e8f\u7684\u53cd\u9988\uff0c\u7136\u540e\u518d\u786e\u8ba4\u5b83\u6b63\u5728\u4fa6\u542c\u4e24\u4e2a localhost \u7aef\u53e3\uff0c\u5176\u4e2d\u4e00\u4e2a\u4f7f\u7528 HTTP\uff0c\u53e6\u4e00\u4e2a\u4f7f\u7528 HTTPS\u3002\u5b9e\u9645\u7aef\u53e3\u53f7\u56e0\u9879\u76ee\u800c\u5f02\uff1a<\/p>\n<pre><code>info: Microsoft.Hosting.Lifetime[0]\n      Now listening on: https:\/\/localhost:7235\ninfo: Microsoft.Hosting.Lifetime[0]\n      Now listening on: http:\/\/localhost:5235<\/code><\/pre>\n<p>\u6253\u5f00\u6d4f\u89c8\u5668\uff0c\u7136\u540e\u5bfc\u822a\u5230\u4f7f\u7528 HTTPS \u7684 URL\u3002\u5728\u6b64\u793a\u4f8b\u968f\u9644\u7684\u4e0b\u8f7d\u4e2d\uff0c\u5373 <a href=\"https:\/\/localhost:7235\u3002\u5982\u679c\u60a8\u7684\u6d4f\u89c8\u5668\u8b66\u544a\u60a8\u8be5\u7ad9\u70b9\u4e0d\u5b89\u5168\uff0c\u60a8\u53ef\u80fd\u5ffd\u7565\u4e86\u4fe1\u4efb\u81ea\u7b7e\u540d\u8bc1\u4e66\u6240\u9700\u7684\u547d\u4ee4\uff1adotnet\">https:\/\/localhost:7235\u3002\u5982\u679c\u60a8\u7684\u6d4f\u89c8\u5668\u8b66\u544a\u60a8\u8be5\u7ad9\u70b9\u4e0d\u5b89\u5168\uff0c\u60a8\u53ef\u80fd\u5ffd\u7565\u4e86\u4fe1\u4efb\u81ea\u7b7e\u540d\u8bc1\u4e66\u6240\u9700\u7684\u547d\u4ee4\uff1adotnet<\/a> dev-certs https --trust\u3002\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u7c7b\u4f3c\u4e8e\u56fe 2.4 \u7684\u5185\u5bb9\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0204.png\"><\/p>\n<p>\u56fe 2.4 \u9996\u9875<\/p>\n<p>\u8be5\u5e94\u7528\u7a0b\u5e8f\u662f\u521d\u7ea7\u7684\u3002\u4e3b\u9875\u5305\u542b\u6700\u5c11\u7684\u6837\u5f0f\u548c\u5185\u5bb9\u3002\u4f7f\u7528\u9875\u9762\u9876\u90e8\u7684\u5bfc\u822a\u6216\u9875\u811a\u4e2d\u7684\u94fe\u63a5\u5bfc\u822a\u5230 Privacy \uff08\u9690\u79c1\uff09 \u9875\u9762\u3002\u8bf7\u6ce8\u610f\uff0c\u76f8\u540c\u7684\u6700\u5c0f\u6837\u5f0f\u4e5f\u88ab\u5e94\u7528\u4e8e Privacy \u9875\u9762\uff08\u56fe 2.5\uff09\uff0c\u5e76\u4e14\u5b58\u5728\u5bfc\u822a\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0205.png\"><\/p>\n<p>\u56fe 2.5 \u9690\u79c1\u9875\u9762\u5305\u542b\u4e0e\u4e3b\u9875\u76f8\u540c\u7684\u9875\u7709\u3001\u9875\u811a\u548c\u6837\u5f0f\u3002<\/p>\n<p>\u76ee\u524d\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u6b64\u5e94\u7528\u7a0b\u5e8f\u6267\u884c\u7684\u5176\u4ed6\u4f5c\u4e0d\u591a\u3002\u76ee\u524d\u8fd8\u6ca1\u6709\u4efb\u4f55\u6709\u8da3\u7684\u65b9\u5f0f\u6765\u4e0e\u5b83\u4ea4\u4e92\uff0c\u56e0\u6b64\u662f\u65f6\u5019\u5411\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u4e00\u4e2a\u9875\u9762\u4e86\u3002<\/p>\n<h3>2.1.4 \u6dfb\u52a0\u65b0\u9875\u9762<\/h3>\n<p>\u5728\u672c\u8282\u4e2d\uff0c\u60a8\u5c06\u5411\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u65b0\u9875\u9762\u3002\u60a8\u8fd8\u5c06\u63a2\u7d22\u6dfb\u52a0\u5230 .NET 6 \u4e2d\u7684\u65b0\u529f\u80fd\uff0c\u79f0\u4e3a\u70ed\u91cd\u8f7d\u3002\u6b64\u529f\u80fd\u4f1a\u5bfc\u81f4\u5bf9\u4ee3\u7801\u6240\u505a\u7684\u66f4\u6539\u53cd\u6620\u5728\u6b63\u5728\u8fd0\u884c\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u800c\u65e0\u9700\u91cd\u65b0\u542f\u52a8\u5b83\u3002\u8fd9\u662f\u4e3a Visual Studio \u7528\u6237\u81ea\u52a8\u6fc0\u6d3b\u7684\u3002VS Code \u7528\u6237\u9700\u8981\u4f7f\u7528\u7565\u6709\u4e0d\u540c\u7684\u547d\u4ee4\u6765\u542f\u7528\u70ed\u91cd\u8f7d\u3002\u6b64\u529f\u80fd\u9002\u7528\u4e8e\u5bf9\u73b0\u6709\u6587\u4ef6\u7684\u66f4\u6539\u3002\u7531\u4e8e\u60a8\u8981\u6dfb\u52a0\u65b0\u6587\u4ef6\uff0c\u56e0\u6b64\u9700\u8981\u5148\u505c\u6b62\u5e94\u7528\u7a0b\u5e8f\u3002Visual Studio \u7528\u6237\u53ea\u9700\u5173\u95ed\u6d4f\u89c8\u5668\u5373\u53ef\u505c\u6b62\u5e94\u7528\u7a0b\u5e8f\u3002\u5982\u679c\u60a8\u4f7f\u7528 CLI \u547d\u4ee4\u542f\u52a8\u4e86\u5e94\u7528\u7a0b\u5e8f\uff0c\u5219\u5e94\u5728\u7ec8\u7aef\u7a97\u53e3\u4e2d\u6309 Ctrl-C \u4ee5\u5173\u95ed\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>Visual Studio \u7528\u6237\u5e94\u53f3\u952e\u5355\u51fb Solution Explorer \u4e2d\u7684 Pages \u6587\u4ef6\u5939\uff0c\u7136\u540e\u4ece\u53ef\u7528\u9009\u9879\u4e2d\u9009\u62e9 Add &gt; Razor Page\uff08\u6dfb\u52a0 Razor \u9875\u9762\uff09\uff08\u56fe 2.6\uff09\u3002\u5c06\u6587\u4ef6\u547d\u540d\u4e3a Welcome .cshtml\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0206.png\"><\/p>\n<p>\u56fe 2.6 \u8981\u5728 Visual Studio \u4e2d\u6dfb\u52a0\u65b0\u9875\u9762\uff0c\u8bf7\u53f3\u952e\u5355\u51fb Pages \u6587\u4ef6\u5939\uff0c\u7136\u540e\u9009\u62e9 Add\uff0c\u7136\u540e\u9009\u62e9 Razor Page\u3002<\/p>\n<p>VS Code \u7528\u6237\u5e94\u786e\u4fdd\u5176\u7ec8\u7aef\u4f4d\u4e8e\u9879\u76ee\u6587\u4ef6\u5939\uff08\u5305\u542b csproj \u6587\u4ef6\u7684\u6587\u4ef6\u5939\uff09\u4e2d\uff0c\u7136\u540e\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre><code>dotnet new page -n Welcome -o Pages -na WebApplication1.Pages  <\/code><\/pre>\n<p>new page \u547d\u4ee4\u5c06 Razor \u9875\u9762\u6dfb\u52a0\u5230\u5e94\u7528\u7a0b\u5e8f\u3002-n\uff08\u6216 --name\uff09\u9009\u9879\u6307\u5b9a\u521b\u5efa\u9875\u9762\u65f6\u5e94\u4f7f\u7528\u7684\u540d\u79f0\u3002-o\uff08\u6216 --output\uff09\u9009\u9879\u6307\u5b9a\u5c06\u653e\u7f6e\u9875\u9762\u7684\u8f93\u51fa\u4f4d\u7f6e\u3002-na\uff08\u6216 --namespace\uff09\u9009\u9879\u6307\u5b9a\u5e94\u5e94\u7528\u4e8e\u751f\u6210\u7684 C# \u4ee3\u7801\u6587\u4ef6\u7684\u547d\u540d\u7a7a\u95f4\u3002\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5bfc\u822a\u5230 Pages \u6587\u4ef6\u5939\u4ee5\u521b\u5efa\u9875\u9762\u5e76\u7701\u7565 -o \u9009\u9879\u3002\u5982\u679c\u8fd9\u6837\u505a\uff0c\u5219\u5fc5\u987b\u8bb0\u4f4f\u5bfc\u822a\u56de\u5305\u542b csproj \u6587\u4ef6\u7684\u6587\u4ef6\u5939\uff0c\u4ee5\u4fbf\u5728\u6ca1\u6709\u5176\u4ed6\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\u6267\u884c run \u547d\u4ee4\u3002<\/p>\n<p>Visual Studio \u7528\u6237\u4e0d\u9700\u8981\u6307\u5b9a\u547d\u540d\u7a7a\u95f4\u3002\u5e94\u7528\u4e8e\u4f7f\u7528 Visual Studio \u5411\u5bfc\u521b\u5efa\u7684\u4ee3\u7801\u6587\u4ef6\u7684\u9ed8\u8ba4\u547d\u540d\u7a7a\u95f4\u662f\u901a\u8fc7\u5c06\u9879\u76ee\u540d\u79f0\u4e0e\u5176\u5728\u9879\u76ee\u4e2d\u7684\u4f4d\u7f6e\u8fde\u63a5\u8d77\u6765\u81ea\u52a8\u751f\u6210\u7684\u3002<\/p>\n<p>\u73b0\u5728\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u3002\u8bf7\u8bb0\u4f4f\uff0c\u5728 Visual Studio \u4e2d\u662f Ctrl-F5\uff0c\u800c CLI \u7528\u6237\uff08VS Code \u6216 Visual Studio\uff09\u8fd9\u6b21\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u6267\u884c dotnet watch run\uff08\u800c\u4e0d\u662f dotnet run\uff09\uff0c\u7136\u540e\u6253\u5f00\u6d4f\u89c8\u5668\u5e76\u5bfc\u822a\u5230\u8bb0\u5f55\u5230\u7ec8\u7aef\u7684\u7b2c\u4e00\u4e2a URL\u3002\u5bfc\u822a\u5230 \/welcome\u3002\u9875\u9762\u5e94\u8be5\u9664\u4e86\u9875\u7709\u548c\u9875\u811a\u4e4b\u5916\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9\uff08\u56fe 2.7\uff09\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0207.png\"><\/p>\n<p>\u56fe 2.7 \u65b0\u9875\u9762\u9664\u4e86\u9875\u7709\u548c\u9875\u811a\u4e4b\u5916\u662f\u7a7a\u7684\u3002<\/p>\n<p>\u8fd9\u91cc\u6709\u4e09\u4e2a\u6709\u8da3\u7684\u70b9\u9700\u8981\u6ce8\u610f\u3002\u7b2c\u4e00\u4e2a\u539f\u56e0\u662f\u60a8\u5bfc\u822a\u5230 \/welcome\uff0c\u5e76\u4e14\u627e\u5230\u5e76\u5448\u73b0\u4e86\u60a8\u521a\u521a\u6dfb\u52a0\u5230\u5e94\u7528\u7a0b\u5e8f\u7684 Welcome \u9875\u9762\u3002\u60a8\u65e0\u9700\u6267\u884c\u4efb\u4f55\u914d\u7f6e\u5373\u53ef\u5b9e\u73b0\u6b64\u76ee\u7684\u3002ASP.NET Core \u6846\u67b6\u4e2d\u8d1f\u8d23\u6b64\u4f5c\u7684\u90e8\u5206\u79f0\u4e3a\u8def\u7531\u3002\u5b83\u4f1a\u6839\u636e Razor \u9875\u9762\u5728\u9879\u76ee\u4e2d\u7684\u4f4d\u7f6e\u81ea\u52a8\u67e5\u627e Razor \u9875\u9762\u3002\u7b2c 4 \u7ae0\u8be6\u7ec6\u4ecb\u7ecd\u4e86 routing\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u7b2c\u4e8c\u70b9\u662f\uff0c\u65b0\u9875\u9762\u5305\u62ec\u60a8\u5728\u4e3b\u9875\u548c\u9690\u79c1\u9875\u9762\u4e2d\u770b\u5230\u7684\u5bfc\u822a\u3001\u9875\u811a\u548c\u6837\u5f0f\u3002\u60a8\u7684\u9875\u9762\u4ece\u5e03\u5c40\u6587\u4ef6\uff08\u4e00\u79cd\u4e3b\u6a21\u677f\uff09\u7ee7\u627f\u4e86\u8fd9\u4e9b\u5185\u5bb9\u3002\u540c\u6837\uff0c\u8fd9\u79cd\u60c5\u51b5\u7684\u53d1\u751f\u65e0\u9700\u60a8\u91c7\u53d6\u4efb\u4f55\u5177\u4f53\u6b65\u9aa4\u5373\u53ef\u5b9e\u73b0\u3002\u60a8\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u4e86\u89e3 layout \u6587\u4ef6\u4ee5\u53ca\u5982\u4f55\u914d\u7f6e\u5b83\u4eec\u3002<\/p>\n<p>\u6700\u540e\u8981\u6ce8\u610f\u7684\u662f\u9875\u9762\u7684\u6807\u9898\uff0c\u5982\u6d4f\u89c8\u5668\u9009\u9879\u5361\u4e2d\u6240\u793a\uff1aWebApplication1\u3002\u5e03\u5c40\u9875\u9762\u4e5f\u63d0\u4f9b\u6b64\u503c\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u53ef\u4ee5\u5411\u9875\u9762\u6dfb\u52a0\u4e00\u4e9b\u4ee3\u7801\u3002\u66f4\u65b0 Welcome .cshtml \u7684\u5185\u5bb9\uff0c\u4f7f\u5176\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p>\u6e05\u5355 2.3 \u5411 Welcome \u9875\u9762\u6dfb\u52a0\u5185\u5bb9<\/p>\n<pre><code>@page\n@model WebApplication1.Pages.WelcomeModel\n@{\n    ViewData[&quot;Title&quot;] = &quot;Welcome&quot;;\n}\n&lt;h1&gt;Welcome!&lt;\/h1&gt;<\/code><\/pre>\n<p>\u60a8\u751a\u81f3\u4e0d\u9700\u8981\u5237\u65b0\u6d4f\u89c8\u5668\uff0c\u60a8\u5e94\u7528\u7684\u66f4\u6539\u5c31\u4f1a\u5728\u4fdd\u5b58\u540e\u7acb\u5373\u663e\u793a\u3002\u8fd9\u662f\u70ed\u91cd\u8f7d\u529f\u80fd\u7684\u5de5\u4f5c\u539f\u7406\u3002\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u4e00\u4e2a\u4e00\u7ea7\u6807\u9898\uff0c\u5e76\u4e14\u6d4f\u89c8\u5668\u9009\u9879\u5361\u4e2d\u7684\u6807\u9898\u5df2\u66f4\u6539\u4e3a\u5305\u542b\u60a8\u5e94\u7528\u4e8e ViewData[\u201cTitle\u201d] \u7684\u503c\uff08\u56fe 2.8\uff09\u3002ViewData \u662f\u4e00\u79cd\u5c06\u6570\u636e\u4ece Razor \u9875\u9762\u4f20\u9012\u5230\u5176\u5e03\u5c40\u7684\u673a\u5236\u3002\u60a8\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u770b\u5230 ViewData \u7684\u5de5\u4f5c\u539f\u7406\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0208.png\"><\/p>\n<p>\u56fe 2.8 \u5bf9 Razor \u9875\u9762\u6240\u505a\u7684\u66f4\u6539\u53ef\u89c1\uff0c\u65e0\u9700\u5237\u65b0\u6d4f\u89c8\u5668\u3002<\/p>\n<h3>\u30002.1.5 \u4fee\u6539\u4ee5\u5305\u542b\u52a8\u6001\u5185\u5bb9<\/h3>\n<p>\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u60a8\u6dfb\u52a0\u7684\u662f\u9759\u6001\u5185\u5bb9\u3002\u6bcf\u6b21\u8fd0\u884c\u6b64\u9875\u9762\u65f6\uff0c\u5b83\u770b\u8d77\u6765\u90fd\u4e00\u6837\u3002\u4f7f\u7528 Razor Pages \u7684\u5168\u90e8\u610f\u4e49\u5728\u4e8e\u663e\u793a\u52a8\u6001\u5185\u5bb9\uff0c\u56e0\u6b64\u73b0\u5728\u662f\u65f6\u5019\u6dfb\u52a0\u4e00\u4e9b\u5185\u5bb9\u4e86\u3002\u5047\u8bbe\u60a8\u9700\u8981\u5728\u8f93\u51fa\u4e2d\u5305\u542b\u5f53\u5929\u90e8\u5206\u7684\u540d\u79f0\uff08\u4f8b\u5982\uff0c\u4e0a\u5348\u3001\u4e0b\u5348\u6216\u665a\u4e0a\uff09\uff0c\u4e5f\u8bb8\u4f5c\u4e3a\u9001\u8fbe\u786e\u8ba4\u8bf4\u660e\u7684\u4e00\u90e8\u5206\uff08\u4f8b\u5982\uff0c\u201c\u60a8\u7684\u5305\u88f9\u5c06\u5728\u65e9\u4e0a\u9001\u5230\u60a8\u8eab\u8fb9\u201d\uff09\u3002\u9996\u5148\uff0c\u60a8\u9700\u8981\u6839\u636e\u65f6\u95f4\u8ba1\u7b97\u4e00\u5929\u7684\u4e00\u90e8\u5206\uff0c\u7136\u540e\u60a8\u9700\u8981\u6e32\u67d3\u5b83\u3002\u4e0b\u9762\u7684\u6e05\u5355\u663e\u793a\u4e86\u5982\u4f55\u4ece\u5f53\u524d\u65f6\u95f4\u83b7\u53d6\u4e00\u5929\u4e2d\u7684\u90e8\u5206\u5e76\u5c06\u5176\u5448\u73b0\u7ed9\u6d4f\u89c8\u5668\u3002<\/p>\n<p>\u5217\u8868 2.4 \u5411 Razor \u9875\u9762\u6dfb\u52a0\u52a8\u6001\u5185\u5bb9<\/p>\n<pre><code>@page\n@model WebApplication1.Pages.WelcomeModel\n@{\n    ViewData[&quot;Title&quot;] = &quot;Welcome!&quot;;\n\n    var partOfDay = &quot;morning&quot;;                                        \u2776\n    if(DateTime.Now.Hour &gt; 12){\n        partOfDay= &quot;afternoon&quot;;                                       \u2777\n    }\n    if(DateTime.Now.Hour &gt; 18){\n        partOfDay= &quot;evening&quot;;                                         \u2778\n    }\n}\n&lt;h1&gt;Welcome&lt;\/h1&gt;\n&lt;p&gt;It is @partOfDay on @DateTime.Now.ToString(\u201cdddd, dd MMMM\u201d)&lt;\/p&gt;    \u2779\n<\/code><\/pre>\n<p>\u2776 partOfDay \u53d8\u91cf\u88ab\u58f0\u660e\u5e76\u521d\u59cb\u5316\u4e3a\u503c \u201cmorning\u201d\u3002<br \/>\n\u2777 \u5982\u679c\u662f\u5728\u4e2d\u5348\u4e4b\u540e\uff0c\u5219\u4f7f\u7528\u503c \u201cafternoon\u201d \u91cd\u65b0\u5206\u914d\u53d8\u91cf\u3002<br \/>\n\u2778 \u5982\u679c\u662f\u5728\u4e0b\u5348 6\uff1a00 \u4e4b\u540e\uff0c\u8be5\u503c\u5c06\u66f4\u65b0\u4e3a\u201c\u665a\u4e0a\u201d\u3002<br \/>\n\u2779 \u53d8\u91cf\u4e0e\u5f53\u524d\u65f6\u95f4\u4e00\u8d77\u5448\u73b0\u5230\u6d4f\u89c8\u5668\u3002<\/p>\n<p>\u8fd9\u4e9b\u66f4\u6539\u6d89\u53ca\u58f0\u660e\u4e00\u4e2a\u540d\u4e3a partOfDay \u7684\u53d8\u91cf\uff0c\u8be5\u53d8\u91cf\u5b9e\u4f8b\u5316\u4e3a\u503c \u201cmorning\u201d\u3002\u4e24\u4e2a if \u8bed\u53e5\u968f\u540e\u4f1a\u6839\u636e\u4e00\u5929\u4e2d\u7684\u65f6\u95f4\u66f4\u6539\u503c\u3002\u5982\u679c\u662f\u5728\u4e2d\u5348\u4e4b\u540e\uff0c\u5219 partOfDay \u5c06\u66f4\u6539\u4e3a \u201cafternoon\u201d\u3002\u4e0b\u5348 6\uff1a00 \u540e\u518d\u6b21\u66f4\u6539\u4e3a\u201c\u665a\u4e0a\u201d\u3002\u6240\u6709\u8fd9\u4e9b\u90fd\u662f\u7eaf C# \u4ee3\u7801\uff0c\u5e76\u653e\u7f6e\u5728\u4ee3\u7801\u5757\u4e2d\uff0c\u8be5\u4ee3\u7801\u5757\u4ee5 @{ \u5f00\u5934\uff0c\u4ee5\u7ed3\u675f } \u7ed3\u5c3e\u3002\u7136\u540e\uff0c\u60a8\u5728 Welcome \u6807\u9898\u4e0b\u6dfb\u52a0\u4e86\u4e00\u4e2a HTML \u6bb5\u843d\u5143\u7d20\uff0c\u5305\u62ec\u5e26\u6709\u4e24\u4e2a C# \u8868\u8fbe\u5f0f\u7684\u6587\u672c\uff0c\u8fd9\u4e24\u4e2a\u8868\u8fbe\u5f0f\u90fd\u4ee5 @ \u7b26\u53f7\u4e3a\u524d\u7f00\u3002\u60a8\u521a\u521a\u7f16\u5199\u4e86\u7b2c\u4e00\u6bb5 Razor \u6a21\u677f\u8bed\u6cd5\u3002@ \u524d\u7f00\u6307\u793a Razor \u5448\u73b0 C# \u8868\u8fbe\u5f0f\u7684\u503c\u3002\u8fd9\u4e00\u6b21\uff0c\u6839\u636e\u4e00\u5929\u4e2d\u7684\u65f6\u95f4\uff0c\u60a8\u5e94\u8be5\u4f1a\u5728\u6807\u9898\u4e0b\u770b\u5230\u5448\u73b0\u7ed9\u6d4f\u89c8\u5668\u7684\u65b0\u6bb5\u843d\uff0c\u5982\u56fe 2.9 \u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0209.png\"><\/p>\n<p>\u56fe 2.9 \u6d4f\u89c8\u5668\u4e2d\u4fee\u6539\u540e\u7684 Welcome \u9875\u9762<\/p>\n<h3>2.1.6 \u5c06\u9875\u9762\u6dfb\u52a0\u5230\u5bfc\u822a<\/h3>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06\u65b0\u9875\u9762\u6dfb\u52a0\u5230\u7ad9\u70b9\u5bfc\u822a\u4e2d\uff0c\u56e0\u6b64\u60a8\u4e0d\u5fc5\u5728\u6d4f\u89c8\u5668\u4e2d\u952e\u5165\u5730\u5740\u5373\u53ef\u627e\u5230\u5b83\u3002\u5728 Pages\/Shared \u6587\u4ef6\u5939\u4e2d\u627e\u5230 _Layout.cshtml \u6587\u4ef6\u5e76\u6253\u5f00\u5b83\u3002\u4f7f\u7528 navbar-nav flex-grow-1 \u7684 CSS \u7c7b\u6807\u8bc6 ul \u5143\u7d20\uff0c\u5e76\u5728\u4e0b\u9762\u7684\u6e05\u5355\u4e2d\u6dfb\u52a0\u7c97\u4f53\u4ee3\u7801\u884c\u3002<\/p>\n<p>\u6e05\u5355 2.5 \u5c06 Welcome \u9875\u9762\u6dfb\u52a0\u5230\u4e3b\u5bfc\u822a\u4e2d<\/p>\n<pre><code>&lt;ul class=&quot;navbar-nav flex-grow-1&quot;&gt;\n    &lt;li class=&quot;nav-item&quot;&gt;\n        &lt;a class=&quot;nav-link text-dark&quot; asp-area=&quot;&quot; asp-page=&quot;\/Index&quot;&gt;Home&lt;\/a&gt;       \n    &lt;\/li&gt;\n    &lt;li class=&quot;nav-item&quot;&gt;\n        &lt;a class=&quot;nav-link text-dark&quot; asp-area=&quot;&quot; asp-page=&quot;\/Privacy&quot;&gt;Privacy&lt;\/a&gt;\n    &lt;\/li&gt;\n    &lt;li class=&quot;nav-item&quot;&gt;\n        &lt;a class=&quot;nav-link text-dark&quot; asp-area=&quot;&quot; asp-page=&quot;\/Welcome&quot;&gt;Welcome&lt;\/a&gt;\n    &lt;\/li&gt;\n&lt;\/ul&gt;<\/code><\/pre>\n<p>\u518d\u6b21\u5237\u65b0\u6d4f\u89c8\u5668;\u73b0\u5728\uff0c\u6bcf\u4e2a\u9875\u9762\u9876\u90e8\u7684\u5bfc\u822a\u83dc\u5355\u5c06\u5305\u542b\u6307\u5411 Welcome \u9875\u9762\u7684\u94fe\u63a5\u3002\u60a8\u521a\u624d\u6240\u505a\u7684\u66f4\u6539\u5df2\u5e94\u7528\u4e8e\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u6bcf\u4e2a\u9875\u9762\u3002\u8fd9\u662f\u56e0\u4e3a\u60a8\u66f4\u6539\u4e86\u5e03\u5c40\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u7531\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u6240\u6709\u9875\u9762\u4f7f\u7528\u3002Razor \u9875\u9762\u7684\u5185\u5bb9\u4e0e\u5e03\u5c40\u9875\u9762\u4e2d\u7684\u5185\u5bb9\u5408\u5e76\uff0c\u4ee5\u751f\u6210\u6700\u7ec8\u8f93\u51fa\u3002<\/p>\n<p>\u60a8\u53ef\u80fd\u60f3\u77e5\u9053\u4e3a\u4ec0\u4e48\u60a8\u6dfb\u52a0\u5230\u5e03\u5c40\u9875\u9762\u4ee5\u521b\u5efa\u94fe\u63a5\u7684\u951a\u5143\u7d20\u4e0a\u6ca1\u6709 href \u5c5e\u6027\u3002\u6b64\u5143\u7d20\u79f0\u4e3a\u951a\u70b9\u6807\u8bb0\u5e2e\u52a9\u7a0b\u5e8f\u3002\u6807\u8bb0\u5e2e\u52a9\u7a0b\u5e8f\u662f\u9488\u5bf9\u5e38\u89c4 HTML \u5143\u7d20\u7684\u7ec4\u4ef6\uff0c\u5b83\u4f7f\u670d\u52a1\u5668\u7aef\u4ee3\u7801\u80fd\u591f\u901a\u8fc7\u901a\u5e38\u4ee5 asp- \u5f00\u5934\u7684\u7279\u6b8a\u5c5e\u6027\u6765\u5f71\u54cd\u5b83\u4eec\u5448\u73b0\u5230\u6d4f\u89c8\u5668\u7684\u65b9\u5f0f\u3002\u4f8b\u5982\uff0casp-page \u5c5e\u6027\u91c7\u7528\u4e00\u4e2a\u503c\uff0c\u8be5\u503c\u8868\u793a\u8981\u751f\u6210\u94fe\u63a5\u7684\u9875\u9762\u7684\u540d\u79f0\u3002\u6807\u7b7e\u5e2e\u52a9\u7a0b\u5e8f\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u66f4\u8be6\u7ec6\u5730\u4ecb\u7ecd\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u60a8\u5df2\u7ecf\u4e86\u89e3\u4e86 C# \u548c HTML \u5728 Razor \u9875\u9762\u4e2d\u534f\u540c\u5de5\u4f5c\u4ee5\u751f\u6210 HTML \u7684\u4e00\u4e9b\u65b9\u6cd5\u3002\u901a\u5e38\uff0c\u6700\u597d\u7684\u5efa\u8bae\u662f\u5c06 Razor \u9875\u9762\u4e2d\u5305\u542b\u7684 C# \u4ee3\u7801\u91cf\u9650\u5236\u4e3a\u4ec5\u5f71\u54cd\u6f14\u793a\u6587\u7a3f\u6240\u9700\u7684\u4ee3\u7801\u91cf\u3002\u5e94\u7528\u7a0b\u5e8f\u903b\u8f91\uff08\u5305\u62ec\u786e\u5b9a\u65f6\u95f4\u7684\u7b97\u6cd5\uff09\u5e94\u4fdd\u7559\u5728 Razor \u9875\u9762\u6587\u4ef6\u4e2d\u3002Razor \u9875\u9762\u6587\u4ef6\u548c\u5e94\u7528\u7a0b\u5e8f\u903b\u8f91\u4e4b\u95f4\u7684\u7b2c\u4e00\u7ea7\u5206\u79bb\u662f PageModel \u7c7b\uff0c\u8be5\u7c7b\u6784\u6210\u4e86\u4e0b\u4e00\u7ae0\u7684\u91cd\u70b9\uff0c\u4ee5\u53ca\u6211\u5df2\u7ecf\u4ecb\u7ecd\u7684\u5176\u4ed6\u4e0e\u89c6\u56fe\u76f8\u5173\u7684\u6280\u672f\uff0c\u5305\u62ec\u5e03\u5c40\u3001\u90e8\u4ef6\u548c\u6807\u8bb0\u5e2e\u52a9\u7a0b\u5e8f\u3002<\/p>\n<h2>2.2 \u6d4f\u89c8\u5de5\u7a0b\u6587\u4ef6<\/h2>\n<p>\u73b0\u5728\uff0c\u60a8\u5df2\u7ecf\u521b\u5efa\u4e86\u7b2c\u4e00\u4e2a Razor Pages \u5e94\u7528\u7a0b\u5e8f\u5e76\u5c1d\u8bd5\u4e86\u4e00\u4e9b Razor \u8bed\u6cd5\uff0c\u73b0\u5728\u662f\u65f6\u5019\u66f4\u8be6\u7ec6\u5730\u63a2\u7d22\u6784\u6210\u60a8\u521a\u521a\u521b\u5efa\u7684 Web \u5e94\u7528\u7a0b\u5e8f\u7684\u6bcf\u4e2a\u6587\u4ef6\u5939\u548c\u6587\u4ef6\u7684\u5185\u5bb9\uff0c\u4ee5\u4e86\u89e3\u6bcf\u4e2a\u6587\u4ef6\u5939\u548c\u6587\u4ef6\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\u6240\u626e\u6f14\u7684\u89d2\u8272\u3002\u5728\u6b64\u8fc7\u7a0b\u4e2d\uff0c\u60a8\u5c06\u66f4\u6e05\u695a\u5730\u4e86\u89e3 ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u7684\u5de5\u4f5c\u539f\u7406\u3002\u60a8\u8fd8\u5c06\u4e86\u89e3\u78c1\u76d8\u4e0a\u7684\u7269\u7406\u6587\u4ef6\u4e0e\u60a8\u5728 Visual Studio \u7684\u201c\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u7a97\u53e3\u4e2d\u770b\u5230\u7684\u5185\u5bb9\u4e4b\u95f4\u7684\u533a\u522b\u3002<\/p>\n<h3>2.2.1 WebApplication1.sln \u6587\u4ef6<\/h3>\n<p>SLN \u6587\u4ef6\u79f0\u4e3a\u89e3\u51b3\u65b9\u6848\u6587\u4ef6\u3002\u5728 Visual Studio \u4e2d\uff0c\u89e3\u51b3\u65b9\u6848\u5145\u5f53\u7ba1\u7406\u76f8\u5173\u9879\u76ee\u7684\u5bb9\u5668\uff0c\u89e3\u51b3\u65b9\u6848\u6587\u4ef6\u5305\u542b\u6bcf\u4e2a\u9879\u76ee\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u5305\u62ec\u9879\u76ee\u6587\u4ef6\u7684\u8def\u5f84\u3002Visual Studio \u5728\u6253\u5f00\u89e3\u51b3\u65b9\u6848\u65f6\u4f7f\u7528\u6b64\u4fe1\u606f\u52a0\u8f7d\u6240\u6709\u76f8\u5173\u9879\u76ee\u3002<\/p>\n<p>\u8f83\u5927\u7684 Web \u5e94\u7528\u7a0b\u5e8f\u901a\u5e38\u7531\u591a\u4e2a\u9879\u76ee\u7ec4\u6210\uff1a\u4e00\u4e2a\u8d1f\u8d23 UI \u7684 Web \u5e94\u7528\u7a0b\u5e8f\u9879\u76ee\u548c\u591a\u4e2a\u7c7b\u5e93\u9879\u76ee\uff0c\u6bcf\u4e2a\u9879\u76ee\u8d1f\u8d23\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e00\u4e2a\u903b\u8f91\u5c42\uff0c\u4f8b\u5982\u6570\u636e\u8bbf\u95ee\u5c42\u6216\u4e1a\u52a1\u903b\u8f91\u5c42\u3002\u4e5f\u53ef\u80fd\u6709\u4e00\u4e9b\u5355\u5143\u6d4b\u8bd5\u9879\u76ee\u3002\u7136\u540e\uff0c\u60a8\u53ef\u80fd\u4f1a\u770b\u5230\u5176\u4ed6\u9879\u76ee\u6dfb\u52a0\u4e86\u8868\u793a\u5176\u7528\u9014\u7684\u540e\u7f00\uff1aWebApplication1.Tests\u3001WebApplication1.Data \u7b49\u3002<\/p>\n<p>\u6b64\u5e94\u7528\u7a0b\u5e8f\u7531\u5355\u4e2a\u9879\u76ee\u7ec4\u6210\u3002\u56e0\u6b64\uff0c\u5b83\u5b9e\u9645\u4e0a\u6839\u672c\u4e0d\u9700\u8981\u653e\u5728\u89e3\u51b3\u65b9\u6848\u4e2d\uff0c\u4f46 Visual Studio \u4ecd\u7136\u4f1a\u521b\u5efa\u89e3\u51b3\u65b9\u6848\u6587\u4ef6\u3002\u5982\u679c\u4f7f\u7528 CLI \u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\uff0c\u5219\u901a\u8fc7 dotnet new sln \u547d\u4ee4\u521b\u5efa\u4e86\u89e3\u51b3\u65b9\u6848\u6587\u4ef6\u3002\u7136\u540e\uff0c\u901a\u8fc7 dotnet sln add \u547d\u4ee4\u5c06 WebApplication1 \u9879\u76ee\u663e\u5f0f\u6dfb\u52a0\u5230\u89e3\u51b3\u65b9\u6848\u4e2d\u3002\u60a8\u53ef\u4ee5\u8df3\u8fc7\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u4ec5\u5728\u9700\u8981\u5411\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u5176\u4ed6\u9879\u76ee\u65f6\u624d\u521b\u5efa\u89e3\u51b3\u65b9\u6848\u6587\u4ef6\u3002<\/p>\n<h3>2.2.2 WebApplication1.csproj \u6587\u4ef6<\/h3>\n<p>CSPROJ \u6587\u4ef6\u662f\u4e00\u4e2a\u57fa\u4e8e XML \u7684\u6587\u4ef6\uff0c\u5176\u4e2d\u5305\u542b\u6709\u5173\u751f\u6210\u7cfb\u7edf\uff08\u79f0\u4e3a MSBuild\uff09\u7684\u9879\u76ee\u7684\u4fe1\u606f\uff0c\u5b83\u8d1f\u8d23\u5c06\u6e90\u4ee3\u7801\u6587\u4ef6\u8f6c\u6362\u4e3a\u53ef\u9488\u5bf9 .NET \u8fd0\u884c\u65f6\u6267\u884c\u7684\u683c\u5f0f\u3002\u9996\u5148\uff0c\u9879\u76ee\u6587\u4ef6\u5305\u542b\u4e0e\u9879\u76ee\u76ee\u6807\u7684 .NET Framework \u7248\u672c\u548c\u60a8\u6b63\u5728\u4f7f\u7528\u7684 SDK \u76f8\u5173\u7684\u4fe1\u606f\u3002Microsoft.NET.Sdk \u662f\u57fa\u672c SDK\uff0c\u7528\u4e8e\u6784\u5efa\u63a7\u5236\u53f0\u548c\u7c7b\u5e93\u9879\u76ee\u7b49\u3002Web \u5e94\u7528\u7a0b\u5e8f\u662f\u9488\u5bf9 Microsoft.NET.Sdk.Web SDK \u6784\u5efa\u7684\u3002<\/p>\n<p>\u9879\u76ee\u6587\u4ef6\u5305\u62ec\u4e24\u4e2a\u9644\u52a0\u5c5e\u6027\uff1aNullable \u548c ImplicitUsings\u3002\u8fd9\u4e9b\u529f\u80fd\u4f7f\u60a8\u80fd\u591f\u5207\u6362\u65b0\u7684 C# \u529f\u80fd\u3002\u7b2c\u4e00\u4e2a\u9009\u9879\u4e3a\u9879\u76ee\u8bbe\u7f6e\u53ef\u4e3a null \u7684\u6ce8\u91ca\u548c\u8b66\u544a\u4e0a\u4e0b\u6587\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u8fd9\u63a7\u5236\u4e86\u60a8\u4ece\u4ee3\u7801\u5206\u6790\u5668\u83b7\u5f97\u7684\u53cd\u9988\u7ea7\u522b\uff0c\u8fd9\u4e9b\u4ee3\u7801\u5206\u6790\u5668\u5728\u4ee3\u7801\u4e2d\u67e5\u627e NullReferenceException \u7684\u6f5c\u5728\u6765\u6e90\u3002\u6b64\u5f02\u5e38\u662f\u6574\u4e2a \u4e2d\u66f4\u591a\u6df7\u6dc6\u548c\u95ee\u9898\u7684\u539f\u56e0\u3002\u6bd4\u5176\u4ed6\u4efb\u4f55\u793e\u533a\u90fd\u4e13\u6ce8\u4e8e NET\u3002\u8be5\u529f\u80fd\u79f0\u4e3a\u53ef\u4e3a null \u7684\u5f15\u7528\u7c7b\u578b\uff0c\u9ed8\u8ba4\u5904\u4e8e\u542f\u7528\u72b6\u6001\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5c06\u503c\u66f4\u6539\u4e3a disable \u6765\u5173\u95ed\u5b83\u3002<\/p>\n<p>ImplicitUsings \u5c5e\u6027\u7528\u4e8e\u542f\u7528\u6216\u7981\u7528 C# 10 \u529f\u80fd\uff0c\u8be5\u529f\u80fd\u53ef\u51cf\u5c11\u4ee3\u7801\u6587\u4ef6\u4e2d\u6240\u9700\u7684\u663e\u5f0f using \u6307\u4ee4\u7684\u6570\u91cf\u3002\u76f8\u53cd\uff0c\u5b83\u4eec\u662f\u5728 SDK \u4e2d\u5168\u5c40\u8bbe\u7f6e\u7684\u3002\u5df2\u5168\u5c40\u542f\u7528\u7684 using \u6307\u4ee4\u7684\u9009\u62e9\u5305\u62ec\u4ee5\u4e0b\u5e38\u7528 API\uff1a<\/p>\n<p>\u2022  System<br \/>\n\u2022  System.Collections.Generic<br \/>\n\u2022  System.Linq<br \/>\n\u2022  System.Threading.Tasks<\/p>\n<p>\u6b64\u5916\uff0c\u8be5\u5217\u8868\u8fd8\u5305\u62ec\u4e00\u7cfb\u5217\u7279\u5b9a\u4e8e ASP.NET Core \u7684 API\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6b64\u529f\u80fd\u4e5f\u5904\u4e8e\u542f\u7528\u72b6\u6001\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5c06\u503c\u8bbe\u7f6e\u4e3a disable \u6216\u5220\u9664\u8be5\u5c5e\u6027\u6765\u7981\u7528\u5b83\u3002<\/p>\n<p>\u968f\u7740\u65f6\u95f4\u7684\u63a8\u79fb\uff0c\u9879\u76ee\u6587\u4ef6\u5c06\u5305\u542b\u6709\u5173\u9879\u76ee\u6240\u4f9d\u8d56\u7684\u5305\u6216\u5916\u90e8\u5e93\u7684\u4fe1\u606f\u3002\u60a8\u53ef\u4ee5\u624b\u52a8\u5c06\u5305\u6dfb\u52a0\u5230\u6b64\u6587\u4ef6\u4e2d\uff0c\u6216\u8005\u66f4\u5e38\u89c1\u7684\u662f\u4f7f\u7528\u5de5\u5177\u6dfb\u52a0\u5305\uff08\u5305\u7ba1\u7406\u5668\uff09\uff0c\u8be5\u5de5\u5177\u5c06\u4e3a\u60a8\u66f4\u65b0\u5de5\u7a0b\u6587\u4ef6\u7684\u5185\u5bb9\u3002\u60a8\u53ef\u4ee5\u7f16\u8f91\u6587\u4ef6\u7684\u5185\u5bb9\u4ee5\u81ea\u5b9a\u4e49\u6784\u5efa\u7684\u5143\u7d20\u3002<\/p>\n<p>\u9879\u76ee\u6587\u4ef6\u5728 Visual Studio \u4e2d\u7684\u201c\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u4e2d\u4e0d\u53ef\u89c1\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u53f3\u952e\u5355\u51fb Solution Explorer \u4e2d\u7684\u9879\u76ee\u5e76\u9009\u62e9 Edit Project File\uff08\u7f16\u8f91\u9879\u76ee\u6587\u4ef6\uff09\u6765\u8bbf\u95ee\u5b83\u3002\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662f VS Code\uff0c\u5219\u8be5\u6587\u4ef6\u5728\u6587\u4ef6\u8d44\u6e90\u7ba1\u7406\u5668\u4e2d\u53ef\u89c1\uff0c\u60a8\u53ef\u4ee5\u50cf\u8bbf\u95ee\u4efb\u4f55\u5176\u4ed6\u6587\u4ef6\u4e00\u6837\u8bbf\u95ee\u548c\u7f16\u8f91\u5b83\u3002<\/p>\n<h3>2.2.3 bin \u548c obj \u6587\u4ef6\u5939<\/h3>\n<p>bin \u548c obj \u6587\u4ef6\u5939\u5728\u6784\u5efa\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u3002\u8fd9\u4e24\u4e2a\u6587\u4ef6\u5939\u53c8\u7ec6\u5206\u4e3a\u4e24\u4e2a\u6587\u4ef6\u5939\uff08Debug \u548c Release\uff09\uff0c\u5b83\u4eec\u5bf9\u5e94\u4e8e\u6784\u5efa\u9879\u76ee\u65f6\u4f7f\u7528\u7684\u6784\u5efa\u914d\u7f6e\u3002\u6700\u521d\uff0cbin \u548c obj \u6587\u4ef6\u5939\u4ec5\u5305\u542b Debug \u6587\u4ef6\u5939\u3002\u53ea\u6709\u5728 Release \u6a21\u5f0f\u4e0b\u6784\u5efa\u540e\uff0c\u624d\u4f1a\u521b\u5efa Release \u6587\u4ef6\u5939\u3002\u9664\u975e\u60a8\u5728\u4e0a\u4e00\u8282\u4e2d\u6309 Ctrl-F5 \u65f6\u66f4\u6539\u4e86\u4efb\u4f55\u914d\u7f6e\u8bbe\u7f6e\uff0c\u5426\u5219\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u76ee\u524d\u4ec5\u5728 Debug \u6a21\u5f0f\u4e0b\u6784\u5efa\u3002<\/p>\n<p>obj \u6587\u4ef6\u5939\u5305\u542b\u6784\u5efa\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5de5\u4ef6\uff0cbin \u6587\u4ef6\u5939\u5305\u542b\u6784\u5efa\u7684\u6700\u7ec8\u8f93\u51fa\u3002\u5728\u7b2c 14 \u7ae0\u4e2d\u53d1\u5e03\u5e94\u7528\u7a0b\u5e8f\u65f6\uff0c\u60a8\u5c06\u66f4\u8be6\u7ec6\u5730\u4e86\u89e3\u6b64\u8f93\u51fa\u3002\u5982\u679c\u5220\u9664 bin \u6216 obj \u6587\u4ef6\u5939\uff0c\u5219\u4f1a\u5728\u4e0b\u6b21\u751f\u6210\u9879\u76ee\u65f6\u91cd\u65b0\u521b\u5efa\u5b83\u4eec\u3002<\/p>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u8fd9\u4e24\u4e2a\u6587\u4ef6\u5939\u5728\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u4e2d\u90fd\u4e0d\u53ef\u89c1\u3002\u4f46\u662f\uff0c\u5982\u679c\u5355\u51fb\u201c\u663e\u793a\u6240\u6709\u6587\u4ef6\u201d\u9009\u9879\uff0c\u5219\u53ef\u4ee5\u770b\u5230\u5b83\u4eec\u4ee5\u865a\u7ebf\u8f6e\u5ed3\u8868\u793a\u3002\u6b64\u6307\u793a\u7b26\u8868\u793a\u6587\u4ef6\u5939\u4e0d\u88ab\u89c6\u4e3a\u9879\u76ee\u672c\u8eab\u7684\u4e00\u90e8\u5206\u3002\u540c\u6837\uff0c\u5b83\u4eec\u5e76\u6ca1\u6709\u5bf9 VS Code \u7528\u6237\u9690\u85cf\u3002<\/p>\n<h3>2.2.4 Properties \u6587\u4ef6\u5939<\/h3>\n<p>Properties \u6587\u4ef6\u5939\u5305\u542b\u7279\u5b9a\u4e8e\u9879\u76ee\u7684\u8d44\u6e90\u548c\u8bbe\u7f6e\u3002\u5f53\u524d\u6587\u4ef6\u5939\u4e2d\u7684\u552f\u4e00\u9879\u76ee\u662f launchSettings.json \u6587\u4ef6\uff0c\u5176\u4e2d\u5305\u542b\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u65f6\u8981\u4f7f\u7528\u7684\u8bbe\u7f6e\u7684\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<p>\u7b2c\u4e00\u7ec4\u8bbe\u7f6e\u4e0e\u7528\u4e8e\u5728\u672c\u5730\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u7684 IIS Express Web \u670d\u52a1\u5668\u914d\u7f6e\u76f8\u5173\u3002IIS Express \u662f\u5b8c\u6574 IIS Web \u670d\u52a1\u5668\u7684\u8f7b\u91cf\u7ea7\u7248\u672c\uff0c\u4e0e Visual Studio \u4e00\u8d77\u5b89\u88c5\u3002<\/p>\n<p>\u7b2c\u4e8c\u7ec4\u8bbe\u7f6e\u8868\u793a\u4e0d\u540c\u7684\u542f\u52a8\u914d\u7f6e\u6587\u4ef6\u3002IIS Express \u914d\u7f6e\u6587\u4ef6\u6307\u5b9a\u5e94\u7528\u7a0b\u5e8f\u5e94\u5728 IIS Express \u4e0a\u8fd0\u884c\u3002\u8bf7\u6ce8\u610f\uff0capplicationUrl \u5305\u542b\u4e00\u4e2a\u7aef\u53e3\u53f7\u3002\u4e3a SSL \u7aef\u53e3\u63d0\u4f9b\u4e86\u4e0d\u540c\u7684\u7aef\u53e3\u53f7\u3002\u8fd9\u4e9b\u662f\u6309\u9879\u76ee\u751f\u6210\u7684\u3002\u5982\u679c\u60a8\u613f\u610f\uff0c\u60a8\u53ef\u4ee5\u81ea\u7531\u66f4\u6539\u7aef\u53e3\u53f7\u3002<\/p>\n<p>\u7b2c\u4e8c\u4e2a\u914d\u7f6e\u6587\u4ef6\u4f7f\u7528\u9879\u76ee\u540d\u79f0\u6765\u6807\u8bc6\u81ea\u8eab\u3002\u5982\u679c\u9009\u62e9\u6b64\u914d\u7f6e\u6587\u4ef6\u6765\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\uff0c\u5b83\u5c06\u5b8c\u5168\u5728\u5176\u5185\u90e8\u6216\u8fdb\u7a0b\u5185 Web \u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u3002\u9ed8\u8ba4\u670d\u52a1\u5668\u5b9e\u73b0\u79f0\u4e3a Kestrel\u3002\u60a8\u5c06\u5728\u672c\u7ae0\u540e\u9762\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002\u6700\u7ec8\u914d\u7f6e\u6587\u4ef6 \uff08WSL 2\uff09 \u4e0e\u5728\u9002\u7528\u4e8e Linux \u7684 Windows \u5b50\u7cfb\u7edf\u4e2d\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u6709\u5173\u3002\u672c\u4e66\u4e0d\u6d89\u53ca WSL\uff0c\u4f46\u5982\u679c\u60a8\u60f3\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\uff0cMicrosoft \u6587\u6863\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5f88\u597d\u7684\u8d77\u70b9\uff1a<a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/wsl\/\">https:\/\/docs.microsoft.com\/en-us\/windows\/wsl\/<\/a>\u3002<\/p>\n<h3>2.2.5 wwwroot \u6587\u4ef6\u5939<\/h3>\n<p>wwwroot \u6587\u4ef6\u5939\u662f Web \u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e00\u4e2a\u7279\u6b8a\u6587\u4ef6\u5939\u3002\u5b83\u5728 Solution Explorer \u4e2d\u6709\u4e00\u4e2a\u5730\u7403\u56fe\u6807\u3002\u5b83\u662f Web \u6839\u76ee\u5f55\uff0c\u5305\u542b\u9759\u6001\u6587\u4ef6\u3002\u7531\u4e8e\u662f Web \u6839\u76ee\u5f55\uff0cwwwroot \u88ab\u914d\u7f6e\u4e3a\u5141\u8bb8\u76f4\u63a5\u6d4f\u89c8\u5176\u5185\u5bb9\u3002\u5b83\u662f\u6837\u5f0f\u8868\u3001JavaScript \u6587\u4ef6\u3001\u56fe\u50cf\u548c\u5176\u4ed6\u5185\u5bb9\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u8fd9\u4e9b\u5185\u5bb9\u5728\u4e0b\u8f7d\u5230\u6d4f\u89c8\u5668\u4e4b\u524d\u4e0d\u9700\u8981\u4efb\u4f55\u5904\u7406\u3002\u56e0\u6b64\uff0c\u60a8\u4e0d\u5e94\u5c06\u4efb\u4f55\u4e0d\u5e0c\u671b\u7528\u6237\u80fd\u591f\u8bbf\u95ee\u7684\u6587\u4ef6\u653e\u5728 wwwroot \u6587\u4ef6\u5939\u4e2d\u3002\u53ef\u4ee5\u5c06\u5907\u7528\u4f4d\u7f6e\u914d\u7f6e\u4e3a Web \u6839\u76ee\u5f55\uff0c\u4f46\u65b0\u4f4d\u7f6e\u4e0d\u4f1a\u5728\u201c\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u4e2d\u83b7\u5f97\u7279\u6b8a\u56fe\u6807\u3002<\/p>\n<p>\u9879\u76ee\u57fa\u67b6\u5728 wwwroot \u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4e86\u4e09\u4e2a\u6587\u4ef6\u5939\uff1acss\u3001js \u548c lib\u3002css \u6587\u4ef6\u5939\u5305\u542b\u4e00\u4e2a site.css \u6587\u4ef6\uff0c\u5176\u4e2d\u5305\u542b\u6a21\u677f\u7ad9\u70b9\u7684\u4e00\u4e9b\u57fa\u672c\u6837\u5f0f\u58f0\u660e\u3002js \u6587\u4ef6\u5939\u5305\u542b\u4e00\u4e2a\u540d\u4e3a site.js \u7684\u6587\u4ef6\uff0c\u9664\u4e86\u4e00\u4e9b\u6ce8\u91ca\u5916\uff0c\u5b83\u4ec0\u4e48\u90fd\u6ca1\u6709\u3002\u4e00\u822c\u7684\u60f3\u6cd5\u662f\uff0c\u60a8\u5c06\u81ea\u5df1\u7684 JavaScript \u6587\u4ef6\u653e\u5728\u6b64\u6587\u4ef6\u5939\u4e2d\u3002lib \u6587\u4ef6\u5939\u5305\u542b\u5916\u90e8\u6837\u5f0f\u548c\u811a\u672c\u5e93\u3002\u6a21\u677f\u63d0\u4f9b\u7684\u5e93\u662f Bootstrap\uff0c\u4e00\u79cd\u6d41\u884c\u7684 CSS \u6846\u67b6;jQuery\uff0c\u4e00\u4e2a\u8de8\u6d4f\u89c8\u5668\u7684 JavaScript \u5b9e\u7528\u7a0b\u5e8f\u5e93;\u4ee5\u53ca\u4e24\u4e2a\u57fa\u4e8e jQuery \u7684\u9a8c\u8bc1\u5e93\u3002\u5b83\u4eec\u7528\u4e8e\u9a8c\u8bc1\u8868\u5355\u63d0\u4ea4\u3002<\/p>\n<p>wwwroot \u4e2d\u7684\u6587\u4ef6\u5939\u7ed3\u6784\u4e0d\u662f\u4e00\u6210\u4e0d\u53d8\u7684\u3002\u4f60\u53ef\u4ee5\u968f\u5fc3\u6240\u6b32\u5730\u79fb\u52a8\u4e1c\u897f\u3002<\/p>\n<h3>2.2.6 Pages \u6587\u4ef6\u5939<\/h3>\n<p>\u6309\u7167\u7ea6\u5b9a\uff0cPages \u6587\u4ef6\u5939\u914d\u7f6e\u4e3a Razor \u9875\u9762\u6587\u4ef6\u7684\u4e3b\u9875\u3002\u8fd9\u662f\u6846\u67b6\u5e0c\u671b\u627e\u5230 Razor \u9875\u9762\u7684\u4f4d\u7f6e\u3002<\/p>\n<p>\u9879\u76ee\u6a21\u677f\u4ece\u4e09\u4e2a\u9875\u9762\u5f00\u59cb\u3002\u60a8\u5df2\u7ecf\u770b\u5230\u4e86\u5176\u4e2d\u4e24\u4e2a - \u7d22\u5f15\uff08\u6216\u4e3b\u9875\uff09\u548c\u9690\u79c1\u9875\u9762\u3002\u5f53\u7136\uff0c\u60a8\u7684\u793a\u4f8b\u5305\u62ec\u60a8\u521b\u5efa\u7684 Welcome \u9875\u9762\u3002\u9879\u76ee\u6a21\u677f\u63d0\u4f9b\u7684\u7b2c\u4e09\u4e2a\u9875\u9762\u662f Error\u3002\u67e5\u770b\u78c1\u76d8\u4e0a\u7684\u5b9e\u9645\u6587\u4ef6\u5939\uff0c\u60a8\u4f1a\u6ce8\u610f\u5230\u6bcf\u4e2a\u9875\u9762\u90fd\u5305\u542b\u4e24\u4e2a\u6587\u4ef6\uff1a\u4e00\u4e2a\u6269\u5c55\u540d\u4e3a .cshtml \u7684\u6587\u4ef6\uff08Razor \u6587\u4ef6\uff09\uff0c\u53e6\u4e00\u4e2a\u4ee5 .cshtml.cs \u7ed3\u5c3e\u7684\u6587\u4ef6\uff08C# \u4ee3\u7801\u6587\u4ef6\uff09\u3002\u5f53\u60a8\u67e5\u770b Solution Explorer \u65f6\uff0c\u8fd9\u53ef\u80fd\u4e0d\u662f\u7acb\u5373\u663e\u800c\u6613\u89c1\u7684\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6587\u4ef6\u662f\u5d4c\u5957\u7684\uff08\u56fe 2.10\uff09\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5728\u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u9876\u90e8\u7684\u5de5\u5177\u680f\u4e2d\u7981\u7528\u6587\u4ef6\u5d4c\u5957\u6216\u5355\u51fb\u9875\u9762\u65c1\u8fb9\u7684\u5c55\u5f00\u5668\u56fe\u6807\u6765\u67e5\u770b\u5b83\u4eec\uff0c\u8fd9\u4e0d\u4ec5\u4f1a\u663e\u793a\u5d4c\u5957\u6587\u4ef6\uff0c\u8fd8\u4f1a\u663e\u793a\u4e00\u4e2a\u663e\u793a C# \u7c7b\u5927\u7eb2\uff08\u5305\u62ec\u5c5e\u6027\u3001\u5b57\u6bb5\u548c\u65b9\u6cd5\uff09\u7684\u6811\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0210.png\"><\/p>\n<p>\u56fe 2.10 \u89e3\u51b3\u65b9\u6848\u8d44\u6e90\u7ba1\u7406\u5668\u81ea\u52a8\u5d4c\u5957\u76f8\u5173\u6587\u4ef6\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528 menu \u547d\u4ee4\u5207\u6362\u6587\u4ef6\u5d4c\u5957\u3002<\/p>\n<p>\u9876\u7ea7\u6587\u4ef6 \uff08.cshtml \u6587\u4ef6\uff09 \u662f Razor \u9875\u9762\u6587\u4ef6\u3002\u5b83\u4e5f\u79f0\u4e3a\u5185\u5bb9\u9875\u9762\u6587\u4ef6\u6216\u89c6\u56fe\u6587\u4ef6\u3002\u4e3a\u4e86\u4fdd\u6301\u4e00\u81f4\u6027\uff0c\u6211\u5c06\u5176\u79f0\u4e3a Razor \u9875\u9762\uff08\u5355\u6570\uff0c\u5e26\u6709\u5c0f\u5199 p \u4ee5\u533a\u522b\u4e8e Razor Pages \u6846\u67b6\uff09\u3002\u5982\u4e0a\u4e00\u8282\u6240\u793a\uff0c\u6b64\u6587\u4ef6\u5145\u5f53\u89c6\u56fe\u6a21\u677f\uff0c\u5305\u542b Razor \u8bed\u6cd5\uff0c\u8be5\u8bed\u6cd5\u662f C# \u548c HTML \u7684\u6df7\u5408\u4f53\uff0c\u56e0\u6b64\uff0c\u6587\u4ef6\u6269\u5c55\u540d\u662f cs \u548c html\u3002\u7b2c\u4e8c\u4e2a\u6587\u4ef6\u662f\u4e00\u4e2a C# \u4ee3\u7801\u6587\u4ef6\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u6d3e\u751f\u81ea PageModel \u7684\u7c7b\u3002\u6b64\u7c7b\u5145\u5f53 Razor \u9875\u9762\u7684\u7ec4\u5408\u63a7\u5236\u5668\u548c\u89c6\u56fe\u6a21\u578b\u3002\u60a8\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u6587\u4ef6\u3002<\/p>\n<p>Pages \u6587\u4ef6\u5939\u4e2d\u8fd8\u6709\u4e24\u4e2a\u6587\u4ef6 \u2014 \u4e00\u4e2a\u540d\u4e3a _ViewStart.cshtml\uff0c\u53e6\u4e00\u4e2a\u540d\u4e3a _ViewImports.cshtml\u3002\u4ee5\u524d\u5bfc\u4e0b\u5212\u7ebf\u547d\u540d\u7684 Razor \u6587\u4ef6\u4e0d\u5e94\u76f4\u63a5\u5448\u73b0\u3002\u8fd9\u4e24\u4e2a\u6587\u4ef6\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\u8d77\u7740\u91cd\u8981\u4f5c\u7528\uff0c\u4e0d\u5e94\u91cd\u547d\u540d\u5b83\u4eec\u3002\u8fd9\u4e9b\u6587\u4ef6\u7684\u7528\u9014\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u89e3\u91ca\u3002<\/p>\n<p>Pages \u6587\u4ef6\u5939\u8fd8\u5305\u542b\u4e00\u4e2a Shared \u6587\u4ef6\u5939\u3002\u5176\u4e2d\u8fd8\u6709\u53e6\u5916\u4e24\u4e2a Razor \u6587\u4ef6\uff0c\u540d\u79f0\u4e2d\u90fd\u6709\u524d\u5bfc\u4e0b\u5212\u7ebf\u3002_Layout.cshtml \u6587\u4ef6\u5145\u5f53\u5176\u4ed6\u6587\u4ef6\u7684\u4e3b\u6a21\u677f\uff0c\u5176\u4e2d\u5305\u542b\u5e38\u89c1\u5185\u5bb9\uff0c\u5305\u62ec\u60a8\u5728\u4e0a\u4e00\u8282\u4e2d\u66f4\u6539\u7684\u5bfc\u822a\u3002\u53e6\u4e00\u4e2a Razor \u6587\u4ef6 _ValidationScriptsPartial .cshtml\uff09 \u662f\u90e8\u5206\u6587\u4ef6\u3002\u90e8\u5206\u6587\u4ef6\u901a\u5e38\u7528\u4e8e\u5305\u542b\u53ef\u63d2\u5165\u9875\u9762\u6216\u5e03\u5c40\u7684 UI \u4ee3\u7801\u7247\u6bb5\u3002\u5b83\u4eec\u652f\u6301 HTML \u548c Razor \u8bed\u6cd5\u3002\u6b64\u7279\u5b9a\u90e8\u5206\u6587\u4ef6\u5305\u542b\u5bf9\u5ba2\u6237\u7aef\u9a8c\u8bc1\u5e93\u7684\u4e00\u4e9b\u811a\u672c\u5f15\u7528\u3002\u60a8\u5c06\u5728\u7b2c 5 \u7ae0\u4e2d\u4ecb\u7ecd\u8fd9\u4e9b\u5185\u5bb9\u3002\u6700\u540e\u4e00\u4e2a\u6587\u4ef6\u662f\u4e00\u4e2a CSS \u6837\u5f0f\u8868\uff0c\u5b83\u6709\u4e00\u4e2a\u5947\u602a\u7684\u540d\u5b57\uff1a_Layout .cshtml.css\u3002\u5b83\u5305\u542b\u5e94\u7528\u4e8e _Layout.cshtml \u6587\u4ef6\u7684\u6837\u5f0f\u58f0\u660e\u3002\u547d\u540d\u7ea6\u5b9a\u7531 .NET 6 \u4e2d\u7684\u4e00\u9879\u65b0\u529f\u80fd\u4f7f\u7528\uff0c\u79f0\u4e3a CSS \u9694\u79bb\u3002\u60a8\u5c06\u5728\u7b2c 11 \u7ae0\u4e2d\u4e86\u89e3\u8fd9\u662f\u4ec0\u4e48\u4ee5\u53ca\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002<\/p>\n<h3>2.2.7 \u5e94\u7528\u8bbe\u7f6e\u6587\u4ef6<\/h3>\n<p>\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u6587\u4ef6\u7528\u4f5c\u5b58\u50a8\u5e94\u7528\u7a0b\u5e8f\u8303\u56f4\u7684\u914d\u7f6e\u8bbe\u7f6e\u4fe1\u606f\u7684\u5730\u65b9\u3002\u9879\u76ee\u6a21\u677f\u7531\u4e24\u4e2a\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u6587\u4ef6\u7ec4\u6210\uff1aappSettings.json \u548c appSettings.Development.json\u3002\u7b2c\u4e00\u4e2a appSettings.json \u662f\u5c06\u4e0e\u5df2\u53d1\u5e03\u5e94\u7528\u7a0b\u5e8f\u4e00\u8d77\u90e8\u7f72\u7684\u751f\u4ea7\u7248\u672c\u3002\u53e6\u4e00\u4e2a\u7248\u672c\u662f\u5f00\u53d1\u5e94\u7528\u7a0b\u5e8f\u65f6\u4f7f\u7528\u7684\u7248\u672c\u3002\u6587\u4ef6\u5185\u5bb9\u7684\u7ed3\u6784\u4e3a JSON\u3002<\/p>\n<p>\u8fd9\u4e24\u4e2a\u7248\u672c\u90fd\u5305\u542b\u7528\u4e8e\u65e5\u5fd7\u8bb0\u5f55\u7684\u57fa\u672c\u914d\u7f6e\u3002\u5f00\u53d1\u7248\u672c\u8fd8\u5305\u542b\u4e00\u4e2a\u540d\u4e3a DetailErrors \u7684\u914d\u7f6e\u6761\u76ee\uff0c\u8be5\u6761\u76ee\u8bbe\u7f6e\u4e3a true\u3002\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5e94\u7528\u7a0b\u5e8f\u4e2d\u53d1\u751f\u7684\u4efb\u4f55\u9519\u8bef\u7684\u5b8c\u6574\u8be6\u7ec6\u4fe1\u606f\u5448\u73b0\u5230\u6d4f\u89c8\u5668\u3002\u4e3b\u673a\u7b5b\u9009\u662f\u5728\u751f\u4ea7\u7248\u672c\u4e2d\u914d\u7f6e\u7684\u3002\u60a8\u51e0\u4e4e\u53ef\u4ee5\u5728 app-settings \u6587\u4ef6\u4e2d\u5b58\u50a8\u4efb\u4f55\u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u4fe1\u606f\u3002\u7a0d\u540e\uff0c\u60a8\u5c06\u4f7f\u7528\u5b83\u4eec\u6765\u5b58\u50a8\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32\u548c\u7535\u5b50\u90ae\u4ef6\u8bbe\u7f6e\u3002<\/p>\n<p>\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u6587\u4ef6\u5e76\u4e0d\u662f\u60a8\u53ef\u4ee5\u5b58\u50a8\u914d\u7f6e\u4fe1\u606f\u7684\u552f\u4e00\u4f4d\u7f6e\u3002\u8bb8\u591a\u5176\u4ed6\u4f4d\u7f6e\uff08\u5305\u62ec\u73af\u5883\u53d8\u91cf\uff09\u90fd\u662f\u5f00\u7bb1\u5373\u7528\u7684\uff0c\u60a8\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u4f4d\u7f6e\u3002\u60a8\u5c06\u5728\u7b2c 14 \u7ae0\u4e2d\u4e86\u89e3\u6709\u5173\u914d\u7f6e\u7684\u66f4\u591a\u4fe1\u606f\u3002<\/p>\n<h3>2.2.8 Program.cs<\/h3>\n<p>\u719f\u6089 C# \u7f16\u7a0b\u7684\u8bfb\u8005\u90fd\u77e5\u9053\uff0cProgram.cs \u63d0\u4f9b\u4e86\u63a7\u5236\u53f0\u5e94\u7528\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002\u6309\u7167\u7ea6\u5b9a\uff0c\u5b83\u5305\u542b\u4e00\u4e2a\u9759\u6001 Main \u65b9\u6cd5\uff0c\u5176\u4e2d\u5305\u542b\u7528\u4e8e\u6267\u884c\u5e94\u7528\u7a0b\u5e8f\u7684\u903b\u8f91\u3002\u6b64\u6587\u4ef6\u6ca1\u6709\u4ec0\u4e48\u4e0d\u540c\uff0c\u53ea\u662f\u6ca1\u6709\u53ef\u89c1\u7684 Main \u65b9\u6cd5\u3002\u9879\u76ee\u6a21\u677f\u5229\u7528\u4e86\u4e00\u4e9b\u8f83\u65b0\u7684 C# \u8bed\u8a00\u529f\u80fd\uff0c\u8fd9\u4e9b\u529f\u80fd\u5728 C# 10 \u4e2d\u5f15\u5165\uff0c\u5176\u4e2d\u4e4b\u4e00\u662f\u9876\u7ea7\u8bed\u53e5\u3002\u6b64\u529f\u80fd\u5141\u8bb8\u60a8\u7701\u7565 Program.cs \u4e2d\u7684\u7c7b\u58f0\u660e\u548c Main \u65b9\u6cd5\uff0c\u5e76\u5f00\u59cb\u7f16\u5199\u53ef\u6267\u884c\u4ee3\u7801\u3002\u7f16\u8bd1\u5668\u5c06\u751f\u6210 class \u548c Main \u65b9\u6cd5\uff0c\u5e76\u5728\u8be5\u65b9\u6cd5\u4e2d\u8c03\u7528\u60a8\u7684\u53ef\u6267\u884c\u4ee3\u7801\u3002<\/p>\n<p>Program.cs \u6587\u4ef6\u4e2d\u7684\u4ee3\u7801\u8d1f\u8d23\u914d\u7f6e\u6216\u5f15\u5bfc Web \u5e94\u7528\u7a0b\u5e8f\u5e76\u542f\u52a8\u5b83\u3002\u5728 .NET 5 \u53ca\u66f4\u65e9\u7248\u672c\u4e2d\uff0c\u6b64\u4ee3\u7801\u88ab\u62c6\u5206\u4e3a\u4e24\u4e2a\u5355\u72ec\u7684\u6587\u4ef6\u3002\u5927\u90e8\u5206\u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u88ab\u59d4\u6258\u7ed9\u4e00\u4e2a\u540d\u4e3a Startup \u7684\u5355\u72ec\u7c7b\u3002\u968f\u7740 .NET 6 \u7684\u53d1\u5e03\uff0cASP.NET \u80cc\u540e\u7684\u5f00\u53d1\u4eba\u5458\u8bd5\u56fe\u964d\u4f4e\u8fc7\u53bb\u5b58\u5728\u4e8e\u57fa\u672c\u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u4e2d\u7684\u590d\u6742\u6027\u3002\u4ed6\u4eec\u6ca1\u6709\u5c06\u4ee3\u7801\u8de8\u4e24\u4e2a\u6587\u4ef6\uff0c\u800c\u662f\u5c06\u5176\u5408\u5e76\u5230\u4e00\u4e2a\u6587\u4ef6\u4e2d\uff0c\u5229\u7528\u4e00\u4e9b\u65b0\u7684 C# \u529f\u80fd\u6765\u8fdb\u4e00\u6b65\u51cf\u5c11\u6837\u677f\uff0c\u7136\u540e\u5f15\u5165\u4e86\u4ed6\u4eec\u6240\u8bf4\u7684\u6700\u5c0f\u6258\u7ba1 API\uff0c\u4ee5\u83b7\u53d6\u542f\u52a8\u548c\u8fd0\u884c Razor Pages \u5e94\u7528\u7a0b\u5e8f\u6240\u9700\u7684\u6700\u5c11\u4ee3\u7801\uff0c\u4ee3\u7801\u6700\u5c11\u4e3a 15 \u884c\u3002\u5728\u4ee5\u524d\u7684\u7248\u672c\u4e2d\uff0c\u5b83\u63a5\u8fd1 80 \u884c\u4ee3\u7801\uff0c\u5206\u5e03\u5728\u4e24\u4e2a\u6587\u4ef6\u4e2d\u3002<\/p>\n<p>\u7b2c\u4e00\u884c\u4ee3\u7801\u521b\u5efa\u4e00\u4e2a WebApplicationBuilder\uff1a<\/p>\n<pre><code>var builder = WebApplication.CreateBuilder(args);<\/code><\/pre>\n<p>\u8bf7\u8bb0\u4f4f\uff0c\u6b64\u4ee3\u7801\u5c06\u5728\u7f16\u8bd1\u5668\u751f\u6210\u7684 Main \u65b9\u6cd5\u4e2d\u6267\u884c\uff0c\u56e0\u6b64\u4f20\u9012\u7ed9 CreateBuilder \u65b9\u6cd5\u7684 args \u662f\u7531\u8c03\u7528\u5e94\u7528\u7a0b\u5e8f\u7684\u4efb\u4f55\u8fdb\u7a0b\u4f20\u9012\u5230\u4efb\u4f55 C# \u63a7\u5236\u53f0\u5e94\u7528\u7a0b\u5e8f\u7684 Main \u65b9\u6cd5\u7684\u6807\u51c6 args\u3002<\/p>\n<p>WebApplicationBuilder \u662f .NET 6 \u4e2d\u7684\u65b0\u589e\u529f\u80fd\uff0c\u4e0e\u53e6\u4e00\u79cd\u65b0\u7c7b\u578b\uff08WebApplication\uff09\u4e00\u8d77\u6784\u6210\u4e86\u6700\u5c0f\u6258\u7ba1 API \u7684\u4e00\u90e8\u5206\uff0c\u60a8\u7a0d\u540e\u5c06\u4ecb\u7ecd\u5b83\u3002WebApplicationBuilder \u5177\u6709\u591a\u4e2a\u5c5e\u6027\uff0c\u6bcf\u4e2a\u5c5e\u6027\u90fd\u652f\u6301\u5bf9\u5e94\u7528\u7a0b\u5e8f\u7684\u5404\u4e2a\u65b9\u9762\u8fdb\u884c\u914d\u7f6e\uff1a<\/p>\n<p>\u2022  Environment - \u63d0\u4f9b\u6709\u5173\u5e94\u7528\u7a0b\u5e8f\u8fd0\u884c\u7684 Web \u6258\u7ba1\u73af\u5883\u7684\u4fe1\u606f<br \/>\n\u2022  Services \u2014 \u8868\u793a\u5e94\u7528\u7a0b\u5e8f\u7684\u670d\u52a1\u5bb9\u5668\uff08\u8bf7\u53c2\u9605 \u7b2c 7 \u7ae0\uff09<br \/>\n\u2022  Configuration - \u542f\u7528\u914d\u7f6e\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7ec4\u5408\uff08\u8bf7\u53c2\u9605 14\uff09<br \/>\n\u2022  Logging \u2014 \u901a\u8fc7 ILoggingBuilder \u542f\u7528\u65e5\u5fd7\u8bb0\u5f55\u914d\u7f6e<br \/>\n\u2022  Host \u2014 \u652f\u6301\u914d\u7f6e\u7279\u5b9a\u4e8e\u5e94\u7528\u7a0b\u5e8f\u4e3b\u673a\u7684\u670d\u52a1\uff0c\u5305\u62ec\u7b2c\u4e09\u65b9 DI \u5bb9\u5668<br \/>\n\u2022  WebHost \u2014 \u542f\u7528 Web \u670d\u52a1\u5668\u914d\u7f6e<\/p>\n<p>\u5e94\u7528\u7a0b\u5e8f\u4e3b\u673a\u8d1f\u8d23\u5f15\u5bfc\u5e94\u7528\u7a0b\u5e8f\u3001\u542f\u52a8\u548c\u5173\u95ed\u5e94\u7528\u7a0b\u5e8f\u3002\u672f\u8bed bootstrapping \u662f\u6307\u5e94\u7528\u7a0b\u5e8f\u672c\u8eab\u7684\u521d\u59cb\u914d\u7f6e\u3002\u6b64\u914d\u7f6e\u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<p>\u2022  \u8bbe\u7f6e\u5185\u5bb9\u6839\u8def\u5f84\uff0c\u8fd9\u662f\u5305\u542b\u5e94\u7528\u7a0b\u5e8f\u5185\u5bb9\u6587\u4ef6\u7684\u76ee\u5f55\u7684\u7edd\u5bf9\u8def\u5f84<br \/>\n\u2022  \u4ece\u4f20\u5165 args \u53c2\u6570\u3001app-settings \u6587\u4ef6\u548c\u73af\u5883\u53d8\u91cf\u7684\u4efb\u4f55\u503c\u52a0\u8f7d\u914d\u7f6e\u4fe1\u606f<br \/>\n\u2022  \u914d\u7f6e\u65e5\u5fd7\u8bb0\u5f55\u63d0\u4f9b\u7a0b\u5e8f<\/p>\n<p>\u6240\u6709 .NET \u5e94\u7528\u7a0b\u5e8f\u90fd\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u914d\u7f6e\uff0c\u65e0\u8bba\u5b83\u4eec\u662f Web \u5e94\u7528\u7a0b\u5e8f\u3001\u670d\u52a1\u8fd8\u662f\u63a7\u5236\u53f0\u5e94\u7528\u7a0b\u5e8f\u3002\u6700\u91cd\u8981\u7684\u662f\uff0c\u4e3a Web \u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u4e86 Web \u670d\u52a1\u5668\u3002Web \u670d\u52a1\u5668\u901a\u8fc7 WebHost \u5c5e\u6027\u8fdb\u884c\u914d\u7f6e\uff0c\u8be5\u5c5e\u6027\u8868\u793a IWebHostBuilder \u7c7b\u578b\u7684\u5b9e\u73b0\u3002\u9ed8\u8ba4 Web \u670d\u52a1\u5668\u662f\u540d\u4e3a Kestrel \u7684\u8f7b\u91cf\u7ea7\u4e14\u901f\u5ea6\u6781\u5feb\u7684 Web \u670d\u52a1\u5668\u3002Kestrel \u670d\u52a1\u5668\u5df2\u5408\u5e76\u5230\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002IWebHostBuilder \u8fd8\u914d\u7f6e\u4e3b\u673a\u7b5b\u9009\u4ee5\u53ca\u4e0e Internet Information Services \uff08IIS\uff09\uff08\u5373 Windows Web \u670d\u52a1\u5668\uff09\u7684\u96c6\u6210\u3002<\/p>\n<p>IWebHostBuilder \u5bf9\u8c61\u516c\u5f00\u4e86\u591a\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u652f\u6301\u8fdb\u4e00\u6b65\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u3002\u4f8b\u5982\uff0c\u524d\u9762\u6211\u8ba8\u8bba\u4e86\u5c06 wwwroot \u6587\u4ef6\u5939\u7684\u66ff\u4ee3\u8def\u5f84\u914d\u7f6e\u4e3a Web \u6839\u8def\u5f84\u3002WebHost \u5c5e\u6027\u4f7f\u60a8\u80fd\u591f\u5728\u6709\u5145\u5206\u7406\u7531\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u6b64\u4f5c\u3002\u5728\u4e0b\u9762\u7684\u6e05\u5355\u4e2d\uff0cContent \u6587\u4ef6\u5939\u88ab\u914d\u7f6e\u4e3a wwwroot \u7684\u66ff\u4ee3\u54c1\u3002<\/p>\n<p>\u5217\u8868 2.6 \u914d\u7f6e\u9759\u6001\u6587\u4ef6\u4f4d\u7f6e<\/p>\n<pre><code>builder.WebHost.UseWebRoot(&quot;content&quot;);<\/code><\/pre>\n<p>Services \u5c5e\u6027\u63d0\u4f9b\u4f9d\u8d56\u9879\u6ce8\u5165\u5bb9\u5668\u7684\u5165\u53e3\u70b9\uff0c\u8be5\u5bb9\u5668\u662f\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u7684\u96c6\u4e2d\u4f4d\u7f6e\u3002\u60a8\u5c06\u5728\u7b2c 7 \u7ae0\u4e2d\u66f4\u8be6\u7ec6\u5730\u63a2\u8ba8\u4f9d\u8d56\u5173\u7cfb\u6ce8\u5165\uff0c\u4f46\u4e0e\u6b64\u540c\u65f6\uff0c\u53ea\u9700\u77e5\u9053\u5bb9\u5668\u8d1f\u8d23\u7ba1\u7406\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u7684\u751f\u547d\u5468\u671f\u5e76\u6839\u636e\u9700\u8981\u4e3a\u5e94\u7528\u7a0b\u5e8f\u7684\u4efb\u4f55\u90e8\u5206\u63d0\u4f9b\u5b9e\u4f8b\u5c31\u8db3\u591f\u4e86\u3002\u9ed8\u8ba4\u6a21\u677f\u5305\u62ec\u4ee5\u4e0b\u4ee3\u7801\u884c\uff0c\u8fd9\u4e9b\u4ee3\u7801\u884c\u4f7f Razor Pages \u57fa\u7840\u7ed3\u6784\u6240\u4f9d\u8d56\u7684\u57fa\u672c\u670d\u52a1\u53ef\u4f9b\u5e94\u7528\u7a0b\u5e8f\u4f7f\u7528\uff1a<\/p>\n<pre><code>builder.Services.AddRazorPages();<\/code><\/pre>\n<p>\u8fd9\u4e9b\u670d\u52a1\u5305\u62ec Razor \u89c6\u56fe\u5f15\u64ce\u3001\u6a21\u578b\u7ed1\u5b9a\u3001\u8bf7\u6c42\u9a8c\u8bc1\u3001\u6807\u8bb0\u5e2e\u52a9\u7a0b\u5e8f\u3001\u5185\u5b58\u7f13\u5b58\u548c ViewData\u3002\u5982\u679c\u8fd9\u4e9b\u672f\u8bed\u770b\u8d77\u6765\u4e0d\u719f\u6089\uff0c\u8bf7\u4e0d\u8981\u62c5\u5fc3\u3002\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u60a8\u5c06\u66f4\u8be6\u7ec6\u5730\u4e86\u89e3\u5b83\u4eec\u3002\u9700\u8981\u6ce8\u610f\u7684\u91cd\u8981\u4e00\u70b9\u662f\uff0cServices \u5c5e\u6027\u4e3a\u60a8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4f4d\u7f6e\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u6ce8\u518c\u548c\u914d\u7f6e\u5176\u4ed6\u670d\u52a1\u3002<\/p>\n<p>\u6709\u65f6\uff0c\u8fd9\u4e9b\u670d\u52a1\u662f\u4f60\u9009\u62e9\u542f\u7528\u7684\u6846\u67b6\u7684\u4e00\u90e8\u5206\uff08\u5982 Razor Pages \u793a\u4f8b\uff09\uff0c\u6709\u65f6\u5b83\u4eec\u8868\u793a\u4f60\u4f5c\u4e3a\u5355\u72ec\u5305\u5b89\u88c5\u7684\u670d\u52a1\u3002\u901a\u5e38\uff0c\u5b83\u4eec\u5c06\u662f\u60a8\u81ea\u5df1\u7f16\u5199\u7684\u5305\u542b\u5e94\u7528\u7a0b\u5e8f\u903b\u8f91\u7684\u670d\u52a1\uff0c\u4f8b\u5982\u83b7\u53d6\u548c\u4fdd\u5b58\u6570\u636e\u3002<\/p>\n<p>Build \u65b9\u6cd5\u5c06\u914d\u7f6e\u7684\u5e94\u7528\u7a0b\u5e8f\u4f5c\u4e3a WebApplication \u7c7b\u578b\u7684\u5b9e\u4f8b\u8fd4\u56de\u3002\u6b64\u7c7b\u578b\u8868\u793a\u5176\u4ed6\u4e09\u79cd\u7c7b\u578b\u7684\u5408\u5e76\uff1a<\/p>\n<p>\u2022  IApplicationBuilder \u2014 \u5141\u8bb8\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u7684\u8bf7\u6c42\u6216\u4e2d\u95f4\u4ef6\u7ba1\u9053<br \/>\n\u2022  IEndpointRouteBuilder - \u542f\u7528\u5c06\u4f20\u5165\u8bf7\u6c42\u6620\u5c04\u5230\u7279\u5b9a\u9875\u9762\u7684\u914d\u7f6e<br \/>\n\u2022  IHost - \u63d0\u4f9b\u542f\u52a8\u548c\u505c\u6b62\u5e94\u7528\u7a0b\u5e8f\u7684\u65b9\u6cd5<\/p>\n<p>WebApplication \u5141\u8bb8\u60a8\u6ce8\u518c\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u6765\u6784\u5efa\u548c\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u7684\u8bf7\u6c42\u7ba1\u9053\u3002\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u4ece\u9ad8\u7ea7\u89d2\u5ea6\u770b\u4e00\u4e0b\u4ee5\u4e0b\u6e05\u5355\u4e2d\u7684\u9ed8\u8ba4\u914d\u7f6e\u3002\u60a8\u5c06\u5728\u672c\u4e66\u7684\u540e\u9762\u8be6\u7ec6\u4e86\u89e3 pipeline \u4e2d\u66f4\u6709\u8da3\u7684\u90e8\u5206\u3002<\/p>\n<p>\u5217\u8868 2.7 \u9ed8\u8ba4\u8bf7\u6c42\u7ba1\u9053<\/p>\n<pre><code>if (!app.Environment.IsDevelopment())\n{\n    app.UseExceptionHandler(&quot;\/Error&quot;);\n    app.UseHsts();\n}\napp.UseHttpsRedirection();\napp.UseStaticFiles();\napp.UseRouting();\napp.UseAuthorization();\napp.MapRazorPages();\napp.Run();<\/code><\/pre>\n<p>\u6bcf\u4e2a\u4e2d\u95f4\u4ef6\u90fd\u901a\u8fc7 IApplicationBuilder \u7c7b\u578b\u7684\u6269\u5c55\u65b9\u6cd5\u6dfb\u52a0\u5230\u7ba1\u9053\u4e2d\uff0c\u8be5\u65b9\u6cd5\u7531 WebApplication \u5b9e\u73b0\u3002IWebHost- Environment \u53ef\u901a\u8fc7 Environment \u5c5e\u6027\u8bbf\u95ee\uff0c\u8be5\u5c5e\u6027\u5305\u542b\u6709\u5173\u5f53\u524d\u73af\u5883\u7684\u4fe1\u606f\u3002\u60a8\u5c06\u5728\u7b2c 14 \u7ae0\u4e2d\u4e86\u89e3\u6709\u5173\u73af\u5883\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u4f46\u76ee\u524d\uff0c\u53ea\u9700\u8bf4\u6b64\u5c5e\u6027\u7528\u4e8e\u786e\u5b9a\u5e94\u7528\u7a0b\u5e8f\u5f53\u524d\u662f\u5426\u5728 Development \u6a21\u5f0f\u4e0b\u8fd0\u884c\u5c31\u8db3\u591f\u4e86\uff0c\u5982\u679c\u662f\uff0c\u5219\u8c03\u7528 UseException- Handler \u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u6dfb\u52a0\u4e2d\u95f4\u4ef6\u4ee5\u6355\u83b7\u9519\u8bef\u5e76\u5728\u6d4f\u89c8\u5668\u4e2d\u663e\u793a\u5176\u8be6\u7ec6\u4fe1\u606f\u3002\u5426\u5219\uff0c\u60a8\u5728 Pages \u6587\u4ef6\u5939\u4e2d\u770b\u5230\u7684\u9519\u8bef\u9875\u9762\u5c06\u7528\u4e8e\u663e\u793a\u4e00\u6761\u5e73\u6de1\u65e0\u5947\u7684\u6d88\u606f\uff0c\u8be5\u6d88\u606f\u5411\u7528\u6237\u9690\u85cf\u4e86\u6709\u5173\u9519\u8bef\u7ec6\u8282\u7684\u4efb\u4f55\u654f\u611f\u4fe1\u606f\uff0c\u4f8b\u5982\u5305\u542b\u7528\u6237\u51ed\u636e\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32\u6216\u6709\u5173\u670d\u52a1\u5668\u4e0a\u6587\u4ef6\u8def\u5f84\u7684\u4fe1\u606f\u3002\u6dfb\u52a0 HTTP \u4e25\u683c\u4f20\u8f93\u5b89\u5168\u6807\u5934\u7684\u4e2d\u95f4\u4ef6\u4e5f\u5df2\u6ce8\u518c \uff08app.UseHsts\uff08\uff09\uff09\uff0c\u4f46\u524d\u63d0\u662f\u5e94\u7528\u7a0b\u5e8f\u672a\u5728\u5f00\u53d1\u6a21\u5f0f\u4e0b\u8fd0\u884c\u3002\u6b64\u6807\u5934\u544a\u8bc9\u6d4f\u89c8\u5668\u5728\u8bbf\u95ee\u7f51\u7ad9\u65f6\u4ec5\u4f7f\u7528 HTTPS\u3002\u6211\u5728\u7b2c 13 \u7ae0\u4e2d\u66f4\u8be6\u7ec6\u5730\u4ecb\u7ecd\u4e86\u8fd9\u4e00\u70b9\u3002<\/p>\n<p>UseHttpsRedirection \u65b9\u6cd5\u6dfb\u52a0\u4e86\u4e2d\u95f4\u4ef6\uff0c\u4ee5\u786e\u4fdd\u4efb\u4f55 HTTP \u8bf7\u6c42\u90fd\u91cd\u5b9a\u5411\u5230 HTTPS\u3002\u7136\u540e\uff0c\u5728\u6b64\u4e4b\u540e\uff0c\u6ce8\u518c\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u4e0d\u652f\u6301\u63d0\u4f9b\u9759\u6001\u6587\u4ef6\uff0c\u4f8b\u5982\u56fe\u50cf\u3001\u6837\u5f0f\u8868\u548c\u811a\u672c\u6587\u4ef6\u3002\u60a8\u5fc5\u987b\u9009\u62e9\u4f7f\u7528\u6b64\u529f\u80fd\uff0c\u5e76\u4e14\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u6765\u5b9e\u73b0\u3002\u6b64\u4e2d\u95f4\u4ef6\u5c06 wwwroot \u6587\u4ef6\u5939\u914d\u7f6e\u4e3a\u5141\u8bb8\u76f4\u63a5\u8bf7\u6c42\u9759\u6001\u6587\u4ef6\uff0c\u5e76\u5c06\u5176\u63d0\u4f9b\u7ed9\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u8def\u7531\u4e2d\u95f4\u4ef6\u8d1f\u8d23\u6839\u636e\u8bf7\u6c42\u4e2d\u5305\u542b\u7684\u4fe1\u606f\u9009\u62e9\u5e94\u6267\u884c\u7684\u7aef\u70b9\u3002\u6211\u5728\u7b2c 4 \u7ae0\u4e2d\u8ba8\u8bba\u4e86\u8def\u7531\u5728 Razor Pages \u4e2d\u7684\u5de5\u4f5c\u539f\u7406\u3002\u7136\u540e\uff0c\u6ce8\u518c\u6388\u6743\u4e2d\u95f4\u4ef6\uff0c\u5b83\u8d1f\u8d23\u786e\u5b9a\u5f53\u524d\u7528\u6237\u662f\u5426\u6709\u6743\u8bbf\u95ee\u6240\u8bf7\u6c42\u7684\u8d44\u6e90\u3002\u6388\u6743\u5728\u7b2c 10 \u7ae0\u4e2d\u4ecb\u7ecd\u3002<\/p>\n<p>\u6700\u540e\uff0cMapRazorPages \u65b9\u6cd5\u5c06\u4e2d\u95f4\u4ef6\u6dfb\u52a0\u5230\u6700\u521d\u5c06 Razor Pages \u914d\u7f6e\u4e3a\u7ec8\u7ed3\u70b9\u7684\u7ba1\u9053\u3002\u6b64\u540e\uff0c\u6b64\u4e2d\u95f4\u4ef6\u8fd8\u8d1f\u8d23\u6267\u884c\u8bf7\u6c42\u3002<\/p>\n<h2>2.3 \u7406\u89e3 middleware<\/h2>\n<p>\u54c7\u3002\u90a3\u662f\u5f88\u591a\u62bd\u8c61\u7684\u672f\u8bed\uff01\u7aef\u70b9\u3001\u4e2d\u95f4\u4ef6\u3001\u7ba1\u9053 ...\u4f46\u5b83\u4eec\u5b9e\u9645\u4e0a\u610f\u5473\u7740\u4ec0\u4e48\u5462\uff1f\u4ed6\u4eec\u4ee3\u8868\u4ec0\u4e48\uff1f\u5728\u4e0b\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u66f4\u8be6\u7ec6\u5730\u63a2\u8ba8\u5b83\u4eec\u3002<\/p>\n<p>\u6ce8\u610f ASP.NET Core \u4e2d\u95f4\u4ef6\u662f\u4e00\u4e2a\u76f8\u5f53\u5927\u7684\u8bdd\u9898\u3002\u6211\u5c06\u53ea\u4ecb\u7ecd\u53ef\u80fd\u5728\u5927\u591a\u6570 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u7684\u533a\u57df\u3002\u5982\u679c\u60a8\u60f3\u63a2\u7d22\u66f4\u9ad8\u7ea7\u7684\u4e2d\u95f4\u4ef6\u6982\u5ff5\uff0c\u4f8b\u5982\u5206\u652f\u7ba1\u9053\uff0c\u6211\u63a8\u8350 Andrew Lock \u7684 ASP.NET Core in Action\uff0c Second Edition\uff08Manning\uff0c2021 \u5e74\uff09\u3002<\/p>\n<p>\u9996\u5148\uff0c\u9274\u4e8e Razor Pages \u5e94\u7528\u7a0b\u5e8f\u7684\u76ee\u7684\u662f\u63d0\u4f9b\u5bf9 HTTP \u8bf7\u6c42\u7684\u54cd\u5e94\uff0c\u56e0\u6b64\u67e5\u770b\u548c\u4e86\u89e3 HTTP \u8bf7\u6c42\u7684\u6027\u8d28\u4ee5\u53ca\u5b83\u5728 Razor Pages \u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u8868\u793a\u65b9\u5f0f\u662f\u5408\u9002\u7684\u3002\u8fd9\u5c06\u6784\u6210\u60a8\u4e86\u89e3\u7ba1\u9053\u548c\u7ec8\u7aef\u8282\u70b9\u7684\u57fa\u7840\u3002<\/p>\n<h3>2.3.1 HTTP \u5237\u65b0\u5668<\/h3>\n<p>\u8d85\u6587\u672c\u4f20\u8f93\u534f\u8bae \uff08HTTP\uff09 \u662f\u4e07\u7ef4\u7f51\u7684\u57fa\u7840\u3002\u5b83\u662f\u5728\u5ba2\u6237\u7aef-\u670d\u52a1\u5668\u6a21\u578b\u4e2d\u7684\u7cfb\u7edf\u4e4b\u95f4\u4f20\u8f93\u4fe1\u606f\u7684\u534f\u8bae\u3002HTTP \u4e8b\u52a1\u53ef\u4ee5\u770b\u4f5c\u7531\u4e24\u4e2a\u57fa\u672c\u5143\u7d20\u7ec4\u6210\uff1a\u8bf7\u6c42\u548c\u54cd\u5e94\u3002\u8bf7\u6c42\u662f\u8f93\u5165\uff0c\u54cd\u5e94\u662f\u8f93\u51fa\u3002\u5ba2\u6237\u7aef\u53d1\u8d77\u8bf7\u6c42\uff0c\u670d\u52a1\u5668\u63d0\u4f9b\u54cd\u5e94\uff0c\u5982\u56fe 2.11 \u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0211.png\"><\/p>\n<p>\u56fe 2.11 \u5ba2\u6237\u7aef\uff08\u6d4f\u89c8\u5668\uff09\u53d1\u8d77 HTTP \u8bf7\u6c42\uff0c\u8be5\u8bf7\u6c42\u88ab\u53d1\u9001\u5230\u670d\u52a1\u5668\u3002\u670d\u52a1\u5668\u8d1f\u8d23\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u5df2\u914d\u7f6e\u7684\u5e94\u7528\u7a0b\u5e8f\u5e76\u8fd4\u56de HTTP \u54cd\u5e94\u3002<\/p>\n<p>HTTP \u8bf7\u6c42\u5305\u542b\u8bb8\u591a\u6570\u636e\u3002\u8bf7\u6c42\u6d88\u606f\u7684\u7b2c\u4e00\u884c \uff08\u8d77\u59cb\u884c\uff09 \u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<p>\u2022  HTTP \u65b9\u6cd5<br \/>\n\u2022  \u8d44\u6e90\u7684\u6807\u8bc6\u7b26<br \/>\n\u2022  \u534f\u8bae\u7248\u672c\uff08\u4f8b\u5982 HTTP\/1.1\uff09<\/p>\n<p>\u8be5\u65b9\u6cd5\u7531\u52a8\u8bcd\uff08\u4f8b\u5982 GET\u3001POST\u3001PUT\u3001DELETE\u3001TRACE \u6216 CONNECT\uff09\u6216\u540d\u8bcd\uff08\u4f8b\u5982 HEAD \u6216 OPTIONS\uff09\u8868\u793a\u3002\u5411\u7f51\u7ad9\u8bf7\u6c42\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u662f GET \u548c POST\uff0c\u5176\u4e2d GET \u4e3b\u8981\u7528\u4e8e\u4ece\u670d\u52a1\u5668\u8bf7\u6c42\u6570\u636e\uff0cPOST \u4e3b\u8981\u7528\u4e8e\u5c06\u6570\u636e\u4f20\u8f93\u5230\u670d\u52a1\u5668\uff0c\u5c3d\u7ba1 POST \u65b9\u6cd5\u4e5f\u53ef\u80fd\u5bfc\u81f4\u6570\u636e\u88ab\u53d1\u9001\u56de\u5ba2\u6237\u7aef\u3002\u8fd9\u662f\u672c\u4e66\u4e2d\u5c06\u4ecb\u7ecd\u7684\u4ec5\u6709\u7684\u4e24\u79cd\u65b9\u6cd5\u3002<\/p>\n<p>\u8be5\u6807\u8bc6\u7b26\u7531\u7edf\u4e00\u8d44\u6e90\u6807\u8bc6\u7b26 \uff08URI\uff09 \u8868\u793a\u3002\u6b64\u7279\u5b9a\u6570\u636e\u901a\u5e38\u4e5f\u79f0\u4e3a\u7edf\u4e00\u8d44\u6e90\u5b9a\u4f4d\u7b26 \uff08URL\uff09\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u8868\u793a\u540c\u4e00\u4e8b\u7269\u4e00\u6837\u3002\u4ece\u6280\u672f\u4e0a\u8bb2\uff0c\u5b83\u4eec\u6709\u6240\u4e0d\u540c\u3002\u5c31\u672c\u4e66\u800c\u8a00\uff0c\u77e5\u9053\u6240\u6709 URL \u90fd\u662f URI\uff0c\u4f46\u5e76\u975e\u6240\u6709 URI \u90fd\u662f URL \u5c31\u8db3\u591f\u4e86\u3002RFC3986 \u7684 1.1.3 \u8282\u8be6\u7ec6\u89e3\u91ca\u4e86\u5dee\u5f02\uff1a <a href=\"https:\/\/www.ietf.org\/rfc\/rfc3986.txt.\u5728\u793a\u4f8b\u4e2d\uff0c\u6211\u5c06\u4f7f\u7528\u7684\">https:\/\/www.ietf.org\/rfc\/rfc3986.txt.\u5728\u793a\u4f8b\u4e2d\uff0c\u6211\u5c06\u4f7f\u7528\u7684<\/a> URI \u7c7b\u578b\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u662f URL\u3002<\/p>\n<p>\u8be5\u8bf7\u6c42\u8fd8\u5305\u62ec\u4e00\u7ec4\u6807\u5934 \u2014 \u540d\u79f0-\u503c\u5bf9\uff0c\u53ef\u7528\u4e8e\u5411\u670d\u52a1\u5668\u63d0\u4f9b\u53ef\u80fd\u5f71\u54cd\u5176\u54cd\u5e94\u7684\u5176\u4ed6\u4fe1\u606f\u3002\u4f8b\u5982\uff0cIf-Modified-Since \u6807\u5934\u6307\u5b9a\u65e5\u671f\u65f6\u95f4\u503c\u3002\u5982\u679c\u8bf7\u6c42\u7684\u8d44\u6e90\u5728\u6307\u5b9a\u65f6\u95f4\u540e\u672a\u88ab\u4fee\u6539\uff0c\u5219\u670d\u52a1\u5668\u5e94\u8fd4\u56de 304 Not Modified \u72b6\u6001\u7801;\u5426\u5219\uff0c\u5b83\u5e94\u8be5\u53d1\u9001\u4fee\u6539\u540e\u7684\u8d44\u6e90\u3002\u5176\u4ed6\u6807\u5934\u53ef\u80fd\u4f1a\u901a\u77e5\u670d\u52a1\u5668\u54cd\u5e94\u7684\u9996\u9009\u8bed\u8a00\u6216\u8bf7\u6c42\u8005\u53ef\u4ee5\u5904\u7406\u7684\u5185\u5bb9\u7c7b\u578b\u3002<\/p>\n<p>\u8be5\u8bf7\u6c42\u8fd8\u53ef\u4ee5\u5305\u62ec cookie\uff0c\u5373\u6d4f\u89c8\u5668\u5b58\u50a8\u7684\u4fe1\u606f\u7247\u6bb5\uff0c\u8fd9\u4e9b\u4fe1\u606f\u7247\u6bb5\u53ef\u80fd\u7279\u5b9a\u4e8e\u7f51\u7ad9\u7528\u6237\uff0c\u4e5f\u53ef\u80fd\u4e0d\u7279\u5b9a\u4e8e\u7f51\u7ad9\u7528\u6237\u3002Cookie \u7684\u6700\u5e38\u89c1\u7528\u9014\u5305\u62ec\uff1a\u5728\u7528\u6237\u767b\u5f55\u5230\u7f51\u7ad9\u540e\u5b58\u50a8\u7528\u6237\u7684\u8eab\u4efd\u9a8c\u8bc1\u72b6\u6001\uff0c\u6216\u5b58\u50a8\u4ee4\u724c\uff0c\u7528\u4e8e\u552f\u4e00\u6807\u8bc6\u8bbf\u5ba2\u4ee5\u8fdb\u884c Analytics \u8ddf\u8e2a\u3002<\/p>\n<p>\u8bf7\u6c42\u8fd8\u53ef\u4ee5\u5305\u62ec body\u3002\u901a\u5e38\uff0c\u8fd9\u9002\u7528\u4e8e POST \u8bf7\u6c42\uff0c\u5176\u4e2d\u6b63\u6587\u5305\u542b\u63d0\u4ea4\u7ed9\u670d\u52a1\u5668\u7684\u8868\u5355\u503c\u3002<\/p>\n<p>\u670d\u52a1\u5668\u8fd4\u56de\u7684\u54cd\u5e94\u7684\u7ed3\u6784\u4e0e\u6b64\u7c7b\u4f3c\u3002\u5b83\u6709\u4e00\u4e2a\u72b6\u6001\u884c\uff0c\u8be5\u884c\u6307\u5b9a\u6b63\u5728\u4f7f\u7528\u7684\u534f\u8bae\u7248\u672c\u3001HTTP \u72b6\u6001\u4ee3\u7801\u548c\u4e00\u4e9b\u7528\u4e8e\u63cf\u8ff0\u7ed3\u679c\u7684\u6587\u672c - \u6b63\u5f0f\u540d\u79f0\u4e3a\u539f\u56e0\u77ed\u8bed\u3002\u72b6\u6001\u884c\u793a\u4f8b\u53ef\u80fd\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code>HTTP\/1.1 200 OK<\/code><\/pre>\n<p>\u54cd\u5e94\u8fd8\u53ef\u4ee5\u5305\u542b\u6807\u5934\uff0c\u8fd9\u4e9b\u6807\u5934\u53ef\u4ee5\u6307\u5b9a\u6240\u53d1\u9001\u6570\u636e\u7684\u5185\u5bb9\u7c7b\u578b\u3001\u5927\u5c0f\u4ee5\u53ca\u7528\u4e8e\u5bf9\u54cd\u5e94\u8fdb\u884c\u7f16\u7801\u7684\u65b9\u6cd5\uff08\u5982\u679c\u5df2\u7f16\u7801\uff09\uff0c\u4f8b\u5982 gzip\u3002\u54cd\u5e94\u901a\u5e38\u5305\u62ec\u4e00\u4e2a\u5305\u542b\u5df2\u8bf7\u6c42\u6570\u636e\u7684\u6b63\u6587\u3002<\/p>\n<h3>2.3.2 HttpContext<\/h3>\n<p>HTTP \u4e8b\u52a1\u4e2d\u7684\u6240\u6709\u4fe1\u606f\u90fd\u9700\u8981\u53ef\u4f9b Razor Pages \u5e94\u7528\u7a0b\u5e8f\u4f7f\u7528\u3002\u7528\u4e8e\u5c01\u88c5\u5f53\u524d HTTP \u4e8b\u52a1\uff08\u8bf7\u6c42\u548c\u54cd\u5e94\uff09\u7684\u8be6\u7ec6\u4fe1\u606f\u7684\u5bf9\u8c61\u662f HttpContext \u7c7b\u3002\u5904\u7406\u8bf7\u6c42\u7684\u8fdb\u7a0b\u5185 Web \u670d\u52a1\u5668\u8d1f\u8d23\u4f7f\u7528\u5b9e\u9645 HTTP \u8bf7\u6c42\u4e2d\u7684\u8be6\u7ec6\u4fe1\u606f\u521b\u5efa HttpContext \u7684\u5b9e\u4f8b\u3002\u5b83\u4e3a\u60a8\uff08\u5f00\u53d1\u4eba\u5458\uff09\u63d0\u4f9b\u4e86\u901a\u8fc7\u6b63\u5f0f API \u8bbf\u95ee\u8bf7\u6c42\u6570\u636e\u7684\u6743\u9650\uff0c\u800c\u4e0d\u662f\u5f3a\u8feb\u60a8\u81ea\u5df1\u89e3\u6790 HTTP \u8bf7\u6c42\u4ee5\u83b7\u53d6\u6b64\u4fe1\u606f\u3002HttpContext \u8fd8\u5c01\u88c5\u4e86\u6b64\u7279\u5b9a\u8bf7\u6c42\u7684\u54cd\u5e94\u3002Web \u670d\u52a1\u5668\u521b\u5efa HttpContext \u540e\uff0c\u5b83\u5c31\u53ef\u4f9b\u8bf7\u6c42\u7ba1\u9053\u4f7f\u7528\u3002HttpContext \u4ee5\u5404\u79cd\u5f62\u5f0f\u5728\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u4e2d\u663e\u793a\uff0c\u56e0\u6b64\u60a8\u53ef\u4ee5\u6839\u636e\u9700\u8981\u4f7f\u7528\u5176\u5c5e\u6027\u3002\u8868 2.1 \u8be6\u7ec6\u4ecb\u7ecd\u4e86 HttpContext \u7684\u4e3b\u8981\u5c5e\u6027\u4ee5\u53ca\u5b83\u4eec\u6240\u4ee3\u8868\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u8868 2.1 HttpContext \u5c5e\u6027<\/p>\n<table border=\"1\"  width=\"100%\">\n<colgroup>\n<col   width=\"25%\">\n<col   width=\"75%\">\n<\/colgroup>\n<tbody>\n<tr>\n<th  colspan=\"1\" rowspan=\"1\">\nProperty\n<\/th>\n<th  colspan=\"1\" rowspan=\"1\">\n<\/a>Description\n<\/th>\n<\/tr>\n<tr >\n<td  colspan=\"1\" rowspan=\"1\">\nRequest\n<\/td>\n<td  colspan=\"1\" rowspan=\"1\">\nRepresents the current HTTP request (see table 2.2)\n<\/td>\n<\/tr>\n<tr >\n<td  colspan=\"1\" rowspan=\"1\">\nResponse\n<\/td>\n<td  colspan=\"1\" rowspan=\"1\">\nRepresents the current HTTP response (see table 2.3)\n<\/td>\n<\/tr>\n<tr >\n<td  colspan=\"1\" rowspan=\"1\">\nConnection\n<\/td>\n<td  colspan=\"1\" rowspan=\"1\">\nContains information about the underlying connection for the request, including the port number and the IP address information of the client\n<\/td>\n<\/tr>\n<tr >\n<td  colspan=\"1\" rowspan=\"1\">\nSession\n<\/td>\n<td  colspan=\"1\" rowspan=\"1\">\nProvides a mechanism for storing data scoped to a user, while they browse the website\n<\/td>\n<\/tr>\n<tr >\n<td  colspan=\"1\" rowspan=\"1\">\nUser\n<\/td>\n<td  colspan=\"1\" rowspan=\"1\">\nRepresents the current user (see chapters 9 and 10)\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Request \u5c5e\u6027\u7531 HttpRequest \u7c7b\u8868\u793a\u3002\u8868 2.2 \u8be6\u7ec6\u4ecb\u7ecd\u4e86\u6b64\u7c7b\u7684\u4e3b\u8981\u5c5e\u6027\u53ca\u5176\u7528\u9014\u3002<\/p>\n<p>\u8868 2.2 \u4e3b\u8981 HttpRequest \u5c5e\u6027<\/p>\n<table border=\"1\" class=\"contenttable\" width=\"100%\">\n<colgroup class=\"calibre29\">\n<col class=\"calibre30\" span=\"1\" width=\"25%\">\n<col class=\"calibre30\" span=\"1\" width=\"75%\">\n<\/colgroup>\n<tbody>\n<tr class=\"calibre31\">\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3619\"><\/a>Property<\/p>\n<\/th>\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3620\"><\/a>Description<\/p>\n<\/th>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3621\"><\/a><span class=\"fm-code-in-text1\">Body<\/span><a id=\"calibre_link-682\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3622\"><\/a>A <span class=\"fm-code-in-text1\">Stream<\/span> containing the request body.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3623\"><\/a><span class=\"fm-code-in-text1\">ContentLength<\/span><a id=\"calibre_link-812\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3624\"><\/a>The value of the content-length header detailing the size of the request, measured in bytes.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3625\"><\/a><span class=\"fm-code-in-text1\">ContentType<\/span><a id=\"calibre_link-816\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3626\"><\/a>The value of the content-type header detailing the media type of the request.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3627\"><\/a><span class=\"fm-code-in-text1\">Cookies<\/span><a id=\"calibre_link-840\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3628\"><\/a>Provides access to the cookies collection.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3629\"><\/a><span class=\"fm-code-in-text1\">Form<\/span><a id=\"calibre_link-1223\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3630\"><\/a>Represents submitted form data. You won\u2019t work with this directly. You are more likely to use model binding to access this data (see chapter 5).<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3631\"><\/a><span class=\"fm-code-in-text1\">Headers<\/span><a id=\"calibre_link-1317\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3632\"><\/a>Provides access to all request headers.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3633\"><\/a><span class=\"fm-code-in-text1\">IsHttps<\/span><a id=\"calibre_link-1511\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3634\"><\/a>Indicates whether the current request was made over HTTPS.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3635\"><\/a><span class=\"fm-code-in-text1\">Method<\/span><a id=\"calibre_link-1647\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3636\"><\/a>The HTTP verb used to make the request<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3637\"><\/a><span class=\"fm-code-in-text1\">Path<\/span><a id=\"calibre_link-2029\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3638\"><\/a>The part of the URL after the domain and port<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3639\"><\/a><span class=\"fm-code-in-text1\">Query<\/span><a id=\"calibre_link-2121\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3640\"><\/a>Provides access to query string values as key-value pairs<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"body\"><a class=\"calibre4\" id=\"calibre_link-3641\"><\/a>The <span class=\"fm-code-in-text\">Response<\/span> property<a class=\"calibre4\" id=\"calibre_link-2416\"><\/a> is represented by the <span class=\"fm-code-in-text\">HttpResponse<\/span> class<a class=\"calibre4\" id=\"calibre_link-1364\"><\/a>. Table 2.3 details the main members of this class and their purpose.<\/p>\n<p class=\"fm-table-caption\"><a id=\"calibre_link-3642\"><\/a>Table 2.3 Primary <span class=\"fm-code-in-text\">HttpResponse<\/span> members<\/p>\n<table border=\"1\" class=\"contenttable\" width=\"100%\">\n<colgroup class=\"calibre29\">\n<col class=\"calibre30\" span=\"1\" width=\"25%\">\n<col class=\"calibre30\" span=\"1\" width=\"75%\">\n<\/colgroup>\n<tbody>\n<tr class=\"calibre31\">\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3643\"><\/a>Property<\/p>\n<\/th>\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3644\"><\/a>Description<\/p>\n<\/th>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3645\"><\/a><span class=\"fm-code-in-text1\">ContentLength<\/span><a id=\"calibre_link-813\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3646\"><\/a>The size of the response in bytes, which is assigned to the content-length header.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3647\"><\/a><span class=\"fm-code-in-text1\">ContentType<\/span><a id=\"calibre_link-817\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3648\"><\/a>The media type of the response, which is assigned to the content-type header.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3649\"><\/a><span class=\"fm-code-in-text1\">Cookies<\/span><a id=\"calibre_link-841\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3650\"><\/a>The cookie collection of the outgoing response.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3651\"><\/a><span class=\"fm-code-in-text1\">HasStarted<\/span><a id=\"calibre_link-1314\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3652\"><\/a>Indicates whether the response headers have been sent to the client. If they have, you should not attempt to alter the response. If you do, the values provided in the content-length and content-type headers may no longer be valid, leading to unpredictable results at the client.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3653\"><\/a><span class=\"fm-code-in-text1\">Headers<\/span><a id=\"calibre_link-1318\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3654\"><\/a>Provides access to the response headers.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3655\"><\/a><span class=\"fm-code-in-text1\">StatusCode<\/span><a id=\"calibre_link-2693\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3656\"><\/a>The HTTP status code for the response (e.g., 200, 302, 404, etc.).<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3657\"><\/a><span class=\"fm-code-in-text1\">WriteAsync<\/span><a id=\"calibre_link-3048\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3658\"><\/a>An extension method that writes text to the response body, using UTF-8 encoding.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3659\"><\/a><span class=\"fm-code-in-text1\">Redirect<\/span><a id=\"calibre_link-2342\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3660\"><\/a>Returns a temporary (302) or permanent (301) redirect response to the client, together with the location to redirect to.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Response \u5c5e\u6027\u7531 HttpResponse \u7c7b\u8868\u793a\u3002\u8868 2.3 \u8be6\u7ec6\u8bf4\u660e\u4e86\u8be5\u7c7b\u7684\u4e3b\u8981\u6210\u5458\u53ca\u5176\u7528\u9014\u3002<\/p>\n<p>\u8868 2.3 \u4e3b\u8981 HttpResponse \u6210\u5458<\/p>\n<table border=\"1\" class=\"contenttable\" width=\"100%\">\n<colgroup class=\"calibre29\">\n<col class=\"calibre30\" span=\"1\" width=\"25%\">\n<col class=\"calibre30\" span=\"1\" width=\"75%\">\n<\/colgroup>\n<tbody>\n<tr class=\"calibre31\">\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3643\"><\/a>Property<\/p>\n<\/th>\n<th class=\"fm-contenttable1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-head\"><a id=\"calibre_link-3644\"><\/a>Description<\/p>\n<\/th>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3645\"><\/a><span class=\"fm-code-in-text1\">ContentLength<\/span><a id=\"calibre_link-813\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3646\"><\/a>The size of the response in bytes, which is assigned to the content-length header.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3647\"><\/a><span class=\"fm-code-in-text1\">ContentType<\/span><a id=\"calibre_link-817\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3648\"><\/a>The media type of the response, which is assigned to the content-type header.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3649\"><\/a><span class=\"fm-code-in-text1\">Cookies<\/span><a id=\"calibre_link-841\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3650\"><\/a>The cookie collection of the outgoing response.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3651\"><\/a><span class=\"fm-code-in-text1\">HasStarted<\/span><a id=\"calibre_link-1314\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3652\"><\/a>Indicates whether the response headers have been sent to the client. If they have, you should not attempt to alter the response. If you do, the values provided in the content-length and content-type headers may no longer be valid, leading to unpredictable results at the client.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3653\"><\/a><span class=\"fm-code-in-text1\">Headers<\/span><a id=\"calibre_link-1318\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3654\"><\/a>Provides access to the response headers.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3655\"><\/a><span class=\"fm-code-in-text1\">StatusCode<\/span><a id=\"calibre_link-2693\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3656\"><\/a>The HTTP status code for the response (e.g., 200, 302, 404, etc.).<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3657\"><\/a><span class=\"fm-code-in-text1\">WriteAsync<\/span><a id=\"calibre_link-3048\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3658\"><\/a>An extension method that writes text to the response body, using UTF-8 encoding.<\/p>\n<\/td>\n<\/tr>\n<tr class=\"calibre31\">\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3659\"><\/a><span class=\"fm-code-in-text1\">Redirect<\/span><a id=\"calibre_link-2342\"><\/a><\/p>\n<\/td>\n<td class=\"fm-contenttable2\" colspan=\"1\" rowspan=\"1\">\n<p class=\"fm-table-body\"><a id=\"calibre_link-3660\"><\/a>Returns a temporary (302) or permanent (301) redirect response to the client, together with the location to redirect to.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u8868\u4e2d\u8be6\u8ff0\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u5728\u76f4\u63a5\u5904\u7406\u8bf7\u6c42\u548c\u54cd\u5e94\u65f6\u975e\u5e38\u6709\u7528\uff0c\u4f8b\u5982\uff0c\u5728\u521b\u5efa\u81ea\u5df1\u7684\u4e2d\u95f4\u4ef6\u65f6\u5c06\u6267\u884c\u6b64\u4f5c\u3002<\/p>\n<h3>2.3.3 \u5e94\u7528\u7a0b\u5e8f\u8bf7\u6c42\u7ba1\u9053<\/h3>\n<p>\u5f53 Web \u670d\u52a1\u5668\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u65f6\uff0c\u5e94\u7528\u7a0b\u5e8f\u5fc5\u987b\u51b3\u5b9a\u5982\u4f55\u5904\u7406\u5b83\u3002\u9700\u8981\u8003\u8651\u8bb8\u591a\u56e0\u7d20\u3002\u8bf7\u6c42\u5e94\u5b9a\u5411\u6216\u8def\u7531\u5230\u4f55\u5904\uff1f\u662f\u5426\u5e94\u8bb0\u5f55\u8bf7\u6c42\u7684\u8be6\u7ec6\u4fe1\u606f\uff1f\u5e94\u7528\u7a0b\u5e8f\u662f\u5426\u5e94\u8be5\u53ea\u8fd4\u56de\u6587\u4ef6\u7684\u5185\u5bb9\uff1f\u5b83\u5e94\u8be5\u538b\u7f29\u54cd\u5e94\u5417\uff1f\u5982\u679c\u5728\u5904\u7406\u8bf7\u6c42\u65f6\u9047\u5230\u5f02\u5e38\uff0c\u4f1a\u53d1\u751f\u4ec0\u4e48\u60c5\u51b5\uff1f\u53d1\u51fa\u8bf7\u6c42\u7684\u4eba\u662f\u5426\u771f\u7684\u88ab\u5141\u8bb8\u8bbf\u95ee\u4ed6\u4eec\u8bf7\u6c42\u7684\u8d44\u6e90\uff1f\u5e94\u5982\u4f55\u5904\u7406 Cookie \u6216\u5176\u4ed6\u4e0e\u8bf7\u6c42\u76f8\u5173\u7684\u6570\u636e\uff1f<\/p>\n<p>\u6b64\u51b3\u7b56\u8fc7\u7a0b\u79f0\u4e3a\u8bf7\u6c42\u7ba1\u9053\u3002\u5728 ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8bf7\u6c42\u7ba1\u9053\u7531\u4e00\u7cfb\u5217\u8f6f\u4ef6\u7ec4\u4ef6\u7ec4\u6210\uff0c\u6bcf\u4e2a\u7ec4\u4ef6\u90fd\u6709\u81ea\u5df1\u7684\u5355\u72ec\u8d23\u4efb\u3002\u5176\u4e2d\u4e00\u4e9b\u7ec4\u4ef6\u5728\u8bf7\u6c42\u8fdb\u5165\u5e94\u7528\u7a0b\u5e8f\u7684\u9014\u4e2d\u4f5c\u7528\u4e8e\u8bf7\u6c42\uff0c\u800c\u5176\u4ed6\u7ec4\u4ef6\u5219\u5bf9\u5e94\u7528\u7a0b\u5e8f\u8fd4\u56de\u7684\u54cd\u5e94\u8fdb\u884c\u4f5c\u3002\u6709\u4e9b\u4eba\u53ef\u80fd\u4f1a\u4e24\u8005\u517c\u800c\u6709\u4e4b\u3002\u6267\u884c\u8fd9\u4e9b\u529f\u80fd\u7684\u5404\u4e2a\u7ec4\u4ef6\u79f0\u4e3a\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u56fe 2.12 \u8bf4\u660e\u4e86\u8fd9\u4e2a\u6982\u5ff5\uff0c\u663e\u793a\u4e86\u4e00\u4e2a\u6765\u81ea Web \u670d\u52a1\u5668\u7684\u8bf7\u6c42\uff0c\u7136\u540e\u901a\u8fc7\u591a\u4e2a\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u7684\u7ba1\u9053\u4f20\u9012\uff0c\u7136\u540e\u5230\u8fbe\u6807\u8bb0\u4e3a Razor Pages \u7684\u5b9e\u9645\u5e94\u7528\u7a0b\u5e8f\u672c\u8eab\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0212.png\"><\/p>\n<p>\u56fe 2.12 \u8bf7\u6c42\u8fdb\u5165\u9876\u90e8\u7684\u7ba1\u9053\uff0c\u6d41\u7ecf\u6240\u6709\u4e2d\u95f4\u4ef6\uff0c\u76f4\u5230\u5230\u8fbe Razor Pages\uff0c\u5728\u90a3\u91cc\u8fdb\u884c\u5904\u7406\u5e76\u4f5c\u4e3a\u54cd\u5e94\u8fd4\u56de\u3002<\/p>\n<p>\u8fd9\u5c31\u662f\u5bf9\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u4e3b\u9875\u7684\u8bf7\u6c42\u7684\u6d41\u52a8\u65b9\u5f0f\u3002\u6bcf\u4e2a\u4e2d\u95f4\u4ef6\u90fd\u4f1a\u68c0\u67e5\u8bf7\u6c42\uff0c\u5e76\u786e\u5b9a\u5728\u5c06\u8bf7\u6c42\u4f20\u9012\u5230\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u4e4b\u524d\u662f\u5426\u9700\u8981\u6267\u884c\u4efb\u4f55\u4f5c\u3002\u8bf7\u6c42\u5230\u8fbe Razor Pages \u5e76\u5f97\u5230\u5904\u7406\u540e\uff0c\u54cd\u5e94\u5c06\u6d41\u56de\u670d\u52a1\u5668\uff0c\u56e0\u4e3a\u7ba1\u9053\u7ee7\u7eed\u6cbf\u76f8\u53cd\u65b9\u5411\u8fdb\u884c\u3002\u7ba1\u9053\u672c\u8eab\u5728 Web \u670d\u52a1\u5668\u4e0a\u5f00\u59cb\u548c\u7ed3\u675f\u3002\u5728\u56fe 2.13 \u4e2d\uff0c\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u505a\u51fa\u51b3\u7b56\uff0c\u5e76\u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\uff0c\u6216\u8005\u4f7f\u8fdb\u7a0b\u77ed\u8def\u5e76\u8fd4\u56de\u54cd\u5e94\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0213.png\"><\/p>\n<p>\u56fe 2.13 \u4e2d\u95f4\u4ef6\u5904\u7406\u8bf7\u6c42\uff0c\u5e76\u5728\u8bf7\u6c42\u9488\u5bf9\u5df2\u77e5\u6587\u4ef6\u65f6\u8fd4\u56de\u54cd\u5e94\u3002<\/p>\n<p>\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u4f1a\u68c0\u67e5\u5230\u8fbe\u5b83\u7684\u6bcf\u4e2a\u8bf7\u6c42\uff0c\u4ee5\u786e\u5b9a\u8be5\u8bf7\u6c42\u662f\u5426\u9488\u5bf9\u5df2\u77e5\u6587\u4ef6\uff0c\u5373\u9a7b\u7559\u5728 wwwroot \u6587\u4ef6\u5939\u4e2d\u7684\u6587\u4ef6\u3002\u5982\u679c\u662f\u8fd9\u6837\uff0c\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u53ea\u4f1a\u8fd4\u56de\u6587\u4ef6\uff0c\u4ece\u800c\u4f7f\u7ba1\u9053\u7684\u5176\u4f59\u90e8\u5206\u77ed\u8def\u3002\u5426\u5219\uff0c\u8bf7\u6c42\u5c06\u4f20\u9012\u5230\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u3002<\/p>\n<h3>2.3.4 \u521b\u5efa middleware<\/h3>\n<p>\u73b0\u5728\uff0c\u60a8\u5df2\u7ecf\u66f4\u597d\u5730\u4e86\u89e3\u4e86\u4e2d\u95f4\u4ef6\u6240\u626e\u6f14\u7684\u89d2\u8272\uff0c\u60a8\u5e94\u8be5\u4e86\u89e3\u5b83\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u4e3a\u8bf7\u6c42\u7ba1\u9053\u63d0\u4f9b\u81ea\u5df1\u7684\u81ea\u5b9a\u4e49\u529f\u80fd\u3002\u672c\u8282\u5c06\u4ecb\u7ecd\u5982\u4f55\u521b\u5efa\u60a8\u81ea\u5df1\u7684\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u5e76\u5c06\u5176\u6ce8\u518c\u5230\u7ba1\u9053\u4e2d\u3002<\/p>\n<p>\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u4f5c\u4e3a RequestDelegate\u5b9e\u73b0\uff0c\u5373\uff0c\u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de Task \u7684 .NET \u59d4\u6258\uff0c\u6216\u8005\u6362\u53e5\u8bdd\u8bf4\uff0c\u8868\u793a HttpContext \u4e0a\u7684\u5f02\u6b65\u4f5c\u7684\u65b9\u6cd5\uff1a<\/p>\n<pre><code>public delegate Task RequestDelegate(HttpContext context) <\/code><\/pre>\n<p><b>\u4ee3\u8868 101\uff1a\u5feb\u901f\u590d\u4e60<\/b><\/p>\n<p>.NET \u4e2d\u7684\u59d4\u6258\u662f\u8868\u793a\u65b9\u6cd5\u7b7e\u540d\u548c\u8fd4\u56de\u7c7b\u578b\u7684\u7c7b\u578b\u3002\u4e0b\u9762\u7684\u793a\u4f8b\u58f0\u660e\u4e00\u4e2a\u540d\u4e3a MyDelegate \u7684\u59d4\u6258\uff0c\u8be5\u59d4\u6258\u5c06 DateTime \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de\u4e00\u4e2a\u6574\u6570\uff1a<\/p>\n<pre><code>delegate int MyDelegate(DateTime dt);<\/code><\/pre>\n<p>\u4efb\u4f55\u5177\u6709\u76f8\u540c\u7b7e\u540d\u548c\u8fd4\u56de\u7c7b\u578b\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u5206\u914d\u7ed9 MyDelegate \u7684\u5b9e\u4f8b\u5e76\u8c03\u7528\uff0c\u5305\u62ec\u4e0b\u9762\u663e\u793a\u7684\u4e24\u4e2a\u65b9\u6cd5\u3002<\/p>\n<p>\u6839\u636e\u5339\u914d\u7684\u7b7e\u540d\u548c\u8fd4\u56de\u7c7b\u578b\u4e3a\u59d4\u6258\u5206\u914d\u65b9\u6cd5<\/p>\n<pre><code>int GetMonth(DateTime dt)                    \u2776\n{\n return dt.Month;\n}\nint PointlessAddition(DateTime dt)           \u2776\n{\n    return dt.Year + dt.Month + dt.Day;\n}\n\nMyDelegate example1 = GetMonth;              \u2777\nMyDelegate example2 = PointlessAddition;     \u2777\nConsole.WriteLine(example1(DateTime.Now));   \u2778\nConsole.WriteLine(example2(DateTime.Now));   \u2778<\/code><\/pre>\n<p>\u2776 \u4e24\u79cd\u65b9\u6cd5\u90fd\u91c7\u7528 DateTime \u53c2\u6570\u5e76\u8fd4\u56de\u4e00\u4e2a\u6574\u6570\u3002<br \/>\n\u2777 \u5c06\u4e24\u79cd\u65b9\u6cd5\u90fd\u5206\u914d\u7ed9\u59d4\u6258\u5b9e\u4f8b\u3002<br \/>\n\u2778 \u901a\u8fc7\u59d4\u6258\u5b9e\u4f8b\u8c03\u7528\u65b9\u6cd5\u3002<\/p>\n<p>\u4f60\u53ef\u4ee5\u5c06\u5185\u8054\u533f\u540d\u65b9\u6cd5\u5206\u914d\u7ed9\u59d4\u6258\uff1a<\/p>\n<pre><code>MyDelegate example3 = delegate(DateTime dt) { \nreturn dt.Now.AddYears(-100).Year; };\nConsole.WriteLine(example3(DateTime.Now));<\/code><\/pre>\n<p>\u66f4\u5e38\u89c1\u7684\u662f\uff0c\u60a8\u5c06\u770b\u5230\u4ee5 lambda \u8868\u8fbe\u5f0f\u5f62\u5f0f\u7f16\u5199\u7684\u533f\u540d\u5185\u8054\u65b9\u6cd5\uff0c\u5176\u4e2d\u63a8\u65ad\u4e86\u65b9\u6cd5\u53c2\u6570\u7684\u6570\u636e\u7c7b\u578b\uff1a<\/p>\n<pre><code>MyDelegate example4 = (dt) =&gt; { return dt.Now.AddYears(-100).Year; };\nConsole.WriteLine(example4(DateTime.Now));<\/code><\/pre>\n<p>\u56e0\u6b64\uff0c\u4efb\u4f55\u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de\u4efb\u52a1\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u7528\u4f5c\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u5982\u524d\u6240\u8ff0\uff0c\u4e2d\u95f4\u4ef6\u662f\u901a\u8fc7 WebApplication \u6dfb\u52a0\u5230\u7ba1\u9053\u4e2d\u7684\u3002\u901a\u5e38\uff0c\u4e2d\u95f4\u4ef6\u521b\u5efa\u4e3a\u901a\u8fc7\u6269\u5c55\u65b9\u6cd5\u6ce8\u518c\u7684\u5355\u72ec\u7c7b\uff0c\u4f46\u4e5f\u53ef\u4ee5\u5c06 RequestDelegate\u76f4\u63a5\u6dfb\u52a0\u5230\u7ba1\u9053\u3002\u6e05\u5355 2.8 \u5c55\u793a\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de\u4e00\u4e2a Task\uff0c\u8fd9\u610f\u5473\u7740\u5b83\u6ee1\u8db3 RequestDelegate \u7c7b\u578b\u89c4\u8303\u3002\u5982\u679c\u60a8\u60f3\u5c1d\u8bd5\u6b64\u793a\u4f8b\uff0c\u53ef\u4ee5\u5c06\u65b9\u6cd5\u6dfb\u52a0\u5230 Program.cs\u3002\u60a8\u8fd8\u9700\u8981\u5411 Startup \u7c7b\u6dfb\u52a0 using \u6307\u4ee4\uff0c\u4ee5\u5c06 Microsoft.AspNetCore.Http \u5f15\u5165\u8303\u56f4\u3002<\/p>\n<p>\u793a\u4f8b 2.8 RequestDelegate \u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de Task<\/p>\n<pre><code>async Task TerminalMiddleware(HttpContext context)\n{\n    await context.Response.WriteAsync(&quot;That\u2019s all, folks!&quot;);\n}<\/code><\/pre>\n<p>\u6b64\u7279\u5b9a\u4e2d\u95f4\u4ef6\u5c06\u6d88\u606f\u5199\u5165\u54cd\u5e94\u3002\u63a7\u5236\u6743\u4e0d\u4f1a\u4f20\u9012\u7ed9\u4efb\u4f55\u5176\u4ed6\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\uff0c\u56e0\u6b64\u8fd9\u79cd\u7c7b\u578b\u7684\u4e2d\u95f4\u4ef6\u79f0\u4e3a\u7ec8\u7aef\u4e2d\u95f4\u4ef6\u3002\u5b83\u4f1a\u7ec8\u6b62\u7ba1\u9053\u4e2d\u7684\u8fdb\u4e00\u6b65\u5904\u7406\u3002\u7ec8\u7aef\u4e2d\u95f4\u4ef6\u901a\u8fc7 WebApplication \u5bf9\u8c61\u7684 Run \u65b9\u6cd5\u6ce8\u518c\uff1a<\/p>\n<pre><code>app.Run(TerminalMiddleware);<\/code><\/pre>\n<p>RequestDelegate \u662f\u6807\u51c6\u7684 .NET \u59d4\u6258\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u5c06\u5176\u5185\u8054\u7f16\u5199\u4e3a\u533f\u540d\u51fd\u6570\uff0c\u800c\u4e0d\u662f\u547d\u540d\u65b9\u6cd5\u3002<\/p>\n<p>\u5217\u8868 2.9 \u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u5185\u8054\u6307\u5b9a\u4e3b\u4f53\u7684\u59d4\u6258<\/p>\n<pre><code>app.Run(async context =&gt; \n     await context.Response.WriteAsync(&quot;That\u2019s all, folks!&quot;)\n);<\/code><\/pre>\n<p>\u5c1d\u8bd5\u4f7f\u7528\u4efb\u4e00\u65b9\u6cd5\u901a\u8fc7\u653e\u7f6e\u5e94\u7528\u7a0b\u5e8f\u6765\u6ce8\u518c\u6b64\u4e2d\u95f4\u4ef6\u3002\u5728\u7ba1\u9053\u7684\u5f00\u5934\u8fd0\u884c call \u2014 \u5728\u68c0\u67e5\u5f53\u524d\u73af\u5883\u662f\u5426\u4e3a Development \u7684\u6761\u4ef6\u4e4b\u524d\u3002<\/p>\n<p>\u5217\u8868 2.10 \u5c06\u4e2d\u95f4\u4ef6\u6dfb\u52a0\u5230\u7ba1\u9053\u7684\u5f00\u5934<\/p>\n<pre><code>app.Run(async context =&gt; \n     await context.Response.WriteAsync(&quot;That\u2019s all, folks!&quot;)\n);\nif (app.Environment.IsDevelopment())\n{\n   ...<\/code><\/pre>\n<p>\u7136\u540e\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u5e94\u8be5\u770b\u5230\u5982\u56fe 2.14 \u6240\u793a\u7684\u8f93\u51fa\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/images\/aspnetcorerazorpageinaction\/0214.png\"><\/p>\n<p>\u56fe 2.14 \u4e2d\u95f4\u4ef6\u7684\u8f93\u51fa<\/p>\n<p>\u4e0b\u4e00\u4e2a\u6e05\u5355\u8bf4\u660e\u4e86\u4e00\u4e2a\u4e2d\u95f4\u4ef6\uff0c\u5b83\u6709\u6761\u4ef6\u5730\u5c06\u5904\u7406\u4f20\u9012\u7ed9\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u5217\u8868 2.11 \u6709\u6761\u4ef6\u5730\u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u7684\u4e2d\u95f4\u4ef6<\/p>\n<pre><code>async Task PassThroughMiddleware(HttpContext context, Func&lt;Task&gt; next)\n{\n    if (context.Request.Query.ContainsKey(&quot;stop&quot;))\n    {\n        await context.Response.WriteAsync(&quot;Stop the world&quot;);\n    }\n    else\n    {\n         await next();\n    }\n}<\/code><\/pre>\n<p>\u6b64\u793a\u4f8b\u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\uff0c\u4f46\u5b83\u4e5f\u91c7\u7528\u8fd4\u56de Task \u7684 Func\uff0c\u8868\u793a\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u3002\u5982\u679c\u8bf7\u6c42\u5305\u542b\u540d\u4e3a stop \u7684\u67e5\u8be2\u5b57\u7b26\u4e32\u53c2\u6570\uff0c\u5219\u4e2d\u95f4\u4ef6\u4f1a\u5c06\u7ba1\u9053\u77ed\u8def\uff0c\u5e76\u5c06 Stop the world\uff01 \u5199\u5165\u54cd\u5e94\u3002\u4e0d\u4f1a\u8c03\u7528\u5176\u4ed6\u4e2d\u95f4\u4ef6\u3002\u5426\u5219\uff0c\u5b83\u5c06\u8c03\u7528\u4f20\u5165\u7684 <code>Func&lt;Task&gt;<\/code>\uff0c\u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u3002\u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u7ba1\u9053\u4e2d\u4e0b\u4e00\u4e2a\u7ec4\u4ef6\u7684\u4e2d\u95f4\u4ef6\u4f7f\u7528 Use \u65b9\u6cd5\u6ce8\u518c\uff1a<\/p>\n<pre><code>app.Use(PassThroughMiddleware);<\/code><\/pre>\n<p>\u540c\u6837\uff0c\u6b64\u4e2d\u95f4\u4ef6\u53ef\u4ee5\u7f16\u5199\u4e3a\u5185\u8054 lambda\u3002<\/p>\n<p>\u6e05\u5355 2.12 \u4f7f\u7528 Use \u65b9\u6cd5\u5185\u8054\u6ce8\u518c\u4e2d\u95f4\u4ef6<\/p>\n<pre><code>app.Use(async (context, next) =&gt;\n{\n    if (context.Request.Query.ContainsKey(&quot;stop&quot;))\n    {\n        await context.Response.WriteAsync(&quot;Stop the world&quot;);\n    }\n    await next();\n});<\/code><\/pre>\n<p>\u4f60\u53ef\u4ee5\u901a\u8fc7\u5c06\u4ee3\u7801\u653e\u5728 await next\uff08\uff09 \u4e4b\u540e\uff0c\u5c06\u4ee3\u7801\u6dfb\u52a0\u5230\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u540e\u8fd0\u884c\u3002\u5047\u8bbe\u6ca1\u6709\u5176\u4ed6\u4e2d\u95f4\u4ef6\u4f7f\u7ba1\u9053\u77ed\u8def\uff0c\u5219\u60a8\u653e\u7f6e\u5728\u5176\u4e2d\u7684\u4efb\u4f55 logic \u90fd\u5c06\u5728\u7ba1\u9053\u53cd\u8f6c\u5176\u65b9\u5411\u8fd4\u56de Web \u670d\u52a1\u5668\u65f6\u6267\u884c\u3002\u4f8b\u5982\uff0c\u60a8\u53ef\u80fd\u5e0c\u671b\u6267\u884c\u6b64\u4f5c\u4ee5\u5305\u62ec logging\u3002<\/p>\n<p>Listing 2.13 \u5728\u8c03\u7528\u5176\u4ed6\u4e2d\u95f4\u4ef6\u540e\u6267\u884c\u51fd\u6570<\/p>\n<pre><code>app.Use(async (context, next) =&gt;\n{\n    if (context.Request.Query.ContainsKey(&quot;stop&quot;))\n    {\n        await context.Response.WriteAsync(&quot;Stop the world&quot;);\n    }\n    else\n    {\n        await next();\n        logger.LogInformation(&quot;The world keeps turning&quot;);\n    }\n});<\/code><\/pre>\n<p>\u6ce8\u518c\u4e2d\u95f4\u4ef6\u65f6\uff0c\u4f4d\u7f6e\u5f88\u5173\u952e\u3002\u5982\u679c\u8981\u5c06\u6b64\u4e2d\u95f4\u4ef6\u653e\u5728\u7ba1\u9053\u7684\u5f00\u5934\uff0c\u5b83\u5c06\u9488\u5bf9\u6bcf\u4e2a\u8bf7\u6c42\u6267\u884c\u5e76\u8bb0\u5f55\u4fe1\u606f\u6d88\u606f\uff0c\u9664\u975e\u627e\u5230\u6307\u5b9a\u7684\u67e5\u8be2\u5b57\u7b26\u4e32\u9879\u3002\u5047\u8bbe\u4f60\u8981\u5728 static files middleware \u4e4b\u540e\u6ce8\u518c\u6b64\u4e2d\u95f4\u4ef6\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5b83\u53ea\u4f1a\u6267\u884c\u548c\u8bb0\u5f55\u5bf9\u975e\u9759\u6001\u6587\u4ef6\u8d44\u6e90\u7684\u8bf7\u6c42\uff0c\u56e0\u4e3a\u9759\u6001\u6587\u4ef6\u4e2d\u95f4\u4ef6\u5728\u8fd4\u56de\u9759\u6001\u6587\u4ef6\u65f6\u4f1a\u4f7f\u7ba1\u9053\u77ed\u8def\u3002<\/p>\n<h3>2.3.5 \u4e2d\u95f4\u4ef6\u7c7b<\/h3>\n<p>\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u60a8\u770b\u5230\u7684\u6240\u6709\u793a\u4f8b\u4e2d\u95f4\u4ef6\u90fd\u5df2\u6dfb\u52a0\u4e3a\u5185\u8054 lambda\u3002\u8fd9\u79cd\u65b9\u6cd5\u9002\u7528\u4e8e\u4f60\u76ee\u524d\u770b\u5230\u7684\u7b80\u5355\u4e2d\u95f4\u4ef6\uff0c\u4f46\u5982\u679c\u4f60\u7684\u4e2d\u95f4\u4ef6\u6d89\u53ca\u4efb\u4f55\u590d\u6742\u7a0b\u5ea6\uff0c\u5219\u5f88\u5feb\u5c31\u4f1a\u8fbe\u4e0d\u5230\u8981\u6c42\uff0c\u53ef\u91cd\u7528\u6027\u548c\u53ef\u6d4b\u8bd5\u6027\u90fd\u4f1a\u53d7\u5230\u4e0d\u5229\u5f71\u54cd\u3002\u6b64\u65f6\uff0c\u60a8\u53ef\u80fd\u4f1a\u5728\u4e2d\u95f4\u4ef6\u81ea\u5df1\u7684\u7c7b\u4e2d\u7f16\u5199\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u6709\u4e24\u79cd\u65b9\u6cd5\u53ef\u4ee5\u5b9e\u73b0\u4e2d\u95f4\u4ef6\u7c7b\u3002\u7b2c\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u4ece\u4e00\u5f00\u59cb\u5c31\u662f ASP.NET Core \u7684\u4e00\u90e8\u5206\u3002\u7b2c\u4e8c\u4e2a\u9009\u9879\u6d89\u53ca\u5b9e\u73b0 IMiddleware \u63a5\u53e3\uff0c\u8be5\u63a5\u53e3\u4e0e Razor Pages \u540c\u65f6\u5f15\u5165 ASP.NET Core 2.0\u3002<\/p>\n<h2>\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5<\/h2>\n<p>\u7ea6\u5b9a\u662f\u5fc5\u987b\u5e94\u7528\u4e8e\u67d0\u4e9b\u7ec4\u4ef6\u8bbe\u8ba1\u7684\u89c4\u5219\uff0c\u8fd9\u4e9b\u7ec4\u4ef6\u65e8\u5728\u4e0e\u6846\u67b6\u4e00\u8d77\u4f7f\u7528\uff0c\u4ee5\u4fbf\u5b83\u4eec\u6309\u9884\u671f\u65b9\u5f0f\u8fd0\u884c\u3002\u53ef\u80fd\u5fc5\u987b\u4ee5\u7279\u5b9a\u65b9\u5f0f\u547d\u540d\u7c7b\uff0c\u4ee5\u4fbf\u6846\u67b6\u53ef\u4ee5\u8bc6\u522b\u5b83\u7684\u610f\u56fe\u3002\u4f8b\u5982\uff0cMVC \u4e2d\u7684 controller \u7c7b\u5c31\u662f\u8fd9\u79cd\u60c5\u51b5\uff0c\u5176\u540d\u79f0\u5fc5\u987b\u5305\u62ec Controller \u4f5c\u4e3a\u540e\u7f00\u3002\u6216\u8005\uff0c\u53ef\u80fd\u9002\u7528\u4e00\u4e2a\u7ea6\u5b9a\uff0c\u6307\u5b9a\u4e3a\u7279\u5b9a\u7528\u4f8b\u8bbe\u8ba1\u7684\u7c7b\u5fc5\u987b\u5305\u542b\u4ee5\u67d0\u79cd\u65b9\u5f0f\u547d\u540d\u5e76\u5e26\u6709\u9884\u5b9a\u4e49\u7b7e\u540d\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u5fc5\u987b\u5e94\u7528\u4e8e\u57fa\u4e8e\u7ea6\u5b9a\u7684\u4e2d\u95f4\u4ef6\u7c7b\u7684\u4e24\u4e2a\u7ea6\u5b9a\u662f\uff1a\uff081\uff09 \u58f0\u660e\u4e00\u4e2a\u6784\u9020\u51fd\u6570\uff0c\u8be5\u6784\u9020\u51fd\u6570\u5c06 RequestDelegate \u4f5c\u4e3a\u53c2\u6570\uff0c\u8868\u793a\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\uff0c\u4ee5\u53ca \uff082\uff09 \u4e00\u4e2a\u540d\u4e3a Invoke \u6216 InvokeAsync \u7684\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a Task \u5e76\u81f3\u5c11\u5177\u6709\u4e00\u4e2a\u53c2\u6570\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f HttpContext\u3002<\/p>\n<p>\u8981\u5c1d\u8bd5\u6b64\u4f5c\uff0c\u8bf7\u5c06\u540d\u4e3a IpAddressMiddleware \u7684\u65b0\u7c7b\u6dfb\u52a0\u5230\u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002\u4e3a\u7b80\u5355\u8d77\u89c1\uff0c\u4ee5\u4e0b\u793a\u4f8b\u76f4\u63a5\u6dfb\u52a0\u5230\u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e2d\u3002\u5c06\u4ee3\u7801\u66ff\u6362\u4e3a\u4e0b\u4e00\u4e2a\u5217\u8868\uff0c\u8be5\u5217\u8868\u8bf4\u660e\u4e86\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u7c7b\uff0c\u8be5\u7c7b\u5b9e\u73b0\u8fd9\u4e9b\u7ea6\u5b9a\u5e76\u8bb0\u5f55\u8bbf\u5ba2 IP \u5730\u5740\u7684\u503c\u3002<\/p>\n<p>\u5217\u8868 2.14 \u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u7684\u4e2d\u95f4\u4ef6\u7c7b<\/p>\n<pre><code>namespace WebApplication1\n{\n    public class IpAddressMiddleware\n    {\n        private readonly RequestDelegate _next;\n        public IpAddressMiddleware(RequestDelegate next) =&gt; _next =\nnext;                                                               \u2776\n\n        public async Task InvokeAsync(HttpContext context, \n         ILogger&lt;IpAddressMiddleware&gt; logger)                     \u2777\n        {\n            var ipAddress = context.Connection.RemoteIpAddress;\n            logger.LogInformation($&quot;Visitor is from {ipAddress}&quot;);  \u2778\n            await _next(context);                                   \u2779\n        }\n    }\n}<\/code><\/pre>\n<p>\u2776 \u6784\u9020\u51fd\u6570\u5c06 RequestDelegate \u4f5c\u4e3a\u53c2\u6570\u3002<br \/>\n\u2777 InvokeAsync \u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a\u4efb\u52a1\uff0c\u5e76\u5c06 HttpContext \u4f5c\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u3002\u4efb\u4f55\u5176\u4ed6\u670d\u52a1\u90fd\u5c06\u6ce8\u5165\u5230 Invoke\/InvokeAsync \u65b9\u6cd5\u4e2d\u3002<br \/>\n\u2778 \u5728 InvokeAsync \u65b9\u6cd5\u4e2d\u6267\u884c\u5904\u7406<br \/>\n\u2779 \u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u7ba1\u9053\u4e2d\u7684\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u5c06 using \u6307\u4ee4\u6dfb\u52a0\u5230 Program.cs \u6587\u4ef6\u7684\u9876\u90e8\uff0c\u4ee5\u5c06 WebApplication1 \u547d\u540d\u7a7a\u95f4\u5f15\u5165\u8303\u56f4\uff1a<\/p>\n<pre><code>using WebApplication1;\nvar builder = WebApplication.CreateBuilder(args);<\/code><\/pre>\n<p>\u4e2d\u95f4\u4ef6\u7c7b\u901a\u8fc7 WebApplication \u4e0a\u7684 UseMiddleware \u65b9\u6cd5\u6dfb\u52a0\u5230\u7ba1\u9053\u4e2d\u3002\u6b64\u65b9\u6cd5\u6709\u4e24\u4e2a\u7248\u672c\u3002\u7b2c\u4e00\u4e2a\u9009\u9879\u5c06\u7c7b\u578b\u4f5c\u4e3a\u53c2\u6570\uff1a<\/p>\n<pre><code>app.UseMiddleware(typeof(IpAddressMiddleware));<\/code><\/pre>\n<p>\u7b2c\u4e8c\u4e2a\u7248\u672c\u91c7\u7528\u4e00\u4e2a\u6cdb\u578b\u53c2\u6570\uff0c\u8868\u793a\u4e2d\u95f4\u4ef6\u7c7b\u3002\u8fd9\u4e2a\u7248\u672c\u662f\u4f60\u66f4\u6709\u53ef\u80fd\u9047\u5230\u7684\u7248\u672c\uff1a<\/p>\n<pre><code>app.UseMiddleware&lt;IpAddressMiddleware&gt;();<\/code><\/pre>\n<p>\u6216\u8005\uff0c\u5efa\u8bae\u60a8\u5728 IApplicationBuilder \u4e0a\u521b\u5efa\u81ea\u5df1\u7684\u6269\u5c55\u65b9\u6cd5\u6765\u6ce8\u518c\u4e2d\u95f4\u4ef6\u3002\u4ee5\u4e0b\u793a\u4f8b\uff08\u5982\u4e0b\u9762\u7684\u6e05\u5355\u6240\u793a\uff09\u653e\u7f6e\u5728\u540d\u4e3a Extensions \u7684\u7c7b\u4e2d\uff0c\u8be5\u7c7b\u4e5f\u5df2\u6dfb\u52a0\u5230\u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e2d\u3002<\/p>\n<p>\u6e05\u5355 2.15 \u4f7f\u7528\u6269\u5c55\u65b9\u6cd5\u6ce8\u518c\u4e2d\u95f4\u4ef6<\/p>\n<pre><code>namespace WebApplication1\n{\n    public static class Extensions\n    {\n        public static IApplicationBuilder UseIpAddressMiddleware(this IApplicationBuilder app)\n        {\n            return app.UseMiddleware&lt;IpAddressMiddleware&gt;();\n        }\n    }\n}<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u6269\u5c55\u65b9\u6cd5\u7684\u4f7f\u7528\u65b9\u5f0f\u4e0e\u6ce8\u518c\u6846\u67b6\u4e2d\u95f4\u4ef6\u65f6\u9047\u5230\u7684\u6240\u6709\u5176\u4ed6\u6269\u5c55\u65b9\u6cd5\u76f8\u540c\uff1a<\/p>\n<pre><code>app.UseIpAddressMiddleware();<\/code><\/pre>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u60a8\u53ef\u80fd\u5e0c\u671b\u5728 static files \u4e2d\u95f4\u4ef6\u4e4b\u540e\u6ce8\u518c\u6b64\u4e2d\u95f4\u4ef6\uff0c\u8fd9\u6837\u5b83\u5c31\u4e0d\u4f1a\u4e3a\u6bcf\u4e2a\u8bf7\u6c42\u7684\u6587\u4ef6\u8bb0\u5f55\u540c\u4e00\u8bbf\u95ee\u8005\u7684 IP \u5730\u5740\u3002<\/p>\n<p>\u9075\u5faa\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u7684\u4e2d\u95f4\u4ef6\u5728\u5e94\u7528\u7a0b\u5e8f\u9996\u6b21\u542f\u52a8\u65f6\u521b\u5efa\u4e3a\u5355\u4e00\u5b9e\u4f8b\uff0c\u8fd9\u610f\u5473\u7740\u5728\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u547d\u5468\u671f\u5185\u53ea\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u3002\u6b64\u5b9e\u4f8b\u5c06\u91cd\u590d\u7528\u4e8e\u5230\u8fbe\u5b83\u7684\u6bcf\u4e2a\u8bf7\u6c42\u3002<\/p>\n<h2>\u5b9e\u73b0\u4e2d\u95f4\u4ef6<\/h2>\n<p>\u7f16\u5199\u65b0\u4e2d\u95f4\u4ef6\u7c7b\u7684\u63a8\u8350\u65b9\u6cd5\u6d89\u53ca\u5b9e\u73b0 IMiddleware \u63a5\u53e3\uff0c\u8be5\u63a5\u53e3\u516c\u5f00\u4e00\u79cd\u65b9\u6cd5\uff1a<\/p>\n<p>Task InvokeAsync(HttpContext context, RequestDelegate next)<br \/>\n\u4e0b\u4e00\u4e2a\u6e05\u5355\u663e\u793a\u4e86\u60a8\u4f7f\u7528\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u521b\u5efa\u7684\u76f8\u540c IpAddressMiddleware\uff0c\u5e76\u8fdb\u884c\u4e86\u91cd\u6784\u4ee5\u5b9e\u73b0 IMiddleware\u3002<\/p>\n<p>\u5217\u8868 2.16 \u91cd\u6784 IpAddressMiddleware \u4ee5\u5b9e\u73b0 IMiddleware<\/p>\n<pre><code>public class IpAddressMiddleware : IMiddleware                             \u2776\n{\n    private ILogger&lt;IpAddressMiddleware&gt; _logger;\n    public IpAddressMiddleware(ILogger&lt;IpAddressMiddleware&gt; logger)\n        =&gt; _logger = logger;                                               \u2777\n\n    public async Task InvokeAsync(HttpContext context, RequestDelegate next)\u2778\n    {\n        var ipAddress = context.Connection.RemoteIpAddress;\n        _logger.LogInformation($&quot;Visitor is from {ipAddress}&quot;);\n        await next(context);\n    }\n}<\/code><\/pre>\n<p>\u2776 \u4e2d\u95f4\u4ef6\u7c7b\u5b9e\u73b0 IMiddleware \u63a5\u53e3\u3002<br \/>\n\u2777 \u4f9d\u8d56\u9879\u88ab\u6ce8\u5165\u5230\u6784\u9020\u51fd\u6570\u4e2d\u3002<br \/>\n\u2778 InvokeAsync \u5c06 HttpContext \u548c RequestDelegate \u4f5c\u4e3a\u53c2\u6570\u3002<\/p>\n<p>InvokeAsync \u4e0e\u4f7f\u7528\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u7f16\u5199\u7684 InvokeAsync \u975e\u5e38\u76f8\u4f3c\uff0c\u4e0d\u540c\u4e4b\u5904\u5728\u4e8e\u8fd9\u6b21\u7684\u53c2\u6570\u662f HttpContext \u548c RequestDelegate\u3002\u8be5\u7c7b\u6240\u4f9d\u8d56\u7684\u4efb\u4f55\u670d\u52a1\u90fd\u662f\u901a\u8fc7\u4e2d\u95f4\u4ef6\u7c7b\u7684\u6784\u9020\u51fd\u6570\u6ce8\u5165\u7684\uff0c\u56e0\u6b64\u9700\u8981\u5b57\u6bb5\u6765\u4fdd\u5b58\u6ce8\u5165\u7684\u670d\u52a1\u7684\u5b9e\u4f8b\u3002<\/p>\n<p>\u6b64\u4e2d\u95f4\u4ef6\u7684\u6ce8\u518c\u65b9\u5f0f\u4e0e\u57fa\u4e8e\u7ea6\u5b9a\u7684\u793a\u4f8b\u5b8c\u5168\u76f8\u540c\uff1a\u901a\u8fc7 UseMiddleware \u65b9\u6cd5\u6216\u6269\u5c55\u65b9\u6cd5\u3002\u4f46\u662f\uff0c\u57fa\u4e8e IMiddle ware \u7684\u7ec4\u4ef6\u8fd8\u9700\u8981\u6267\u884c\u4e00\u4e2a\u989d\u5916\u7684\u6b65\u9aa4\uff1a\u5b83\u4eec\u8fd8\u5fc5\u987b\u6ce8\u518c\u5230\u5e94\u7528\u7a0b\u5e8f\u7684\u670d\u52a1\u5bb9\u5668\u4e2d\u3002\u5728\u7b2c 7 \u7ae0\u4e2d\uff0c\u60a8\u5c06\u4e86\u89e3\u6709\u5173\u670d\u52a1\u548c\u4f9d\u8d56\u5173\u7cfb\u6ce8\u5165\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u4f46\u76ee\u524d\uff0c\u53ea\u9700\u77e5\u9053\u60a8\u9700\u8981\u5c06\u4e0b\u4e00\u4e2a\u6e05\u5355\u4e2d\u7684\u7c97\u4f53\u4ee3\u7801\u884c\u6dfb\u52a0\u5230 Program \u7c7b\u5c31\u8db3\u591f\u4e86\u3002<\/p>\n<p>\u6e05\u5355 2.17 \u5c06 IMiddleware \u6ce8\u518c\u4e3a\u670d\u52a1<\/p>\n<pre><code>builder.Services.AddRazorPages();\nbuilder.Services.AddScoped&lt;IpAddressMiddleware&gt;();<\/code><\/pre>\n<p>\u90a3\u4e48\uff0c\u4e3a\u4ec0\u4e48\u6709\u4e24\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u53ef\u4ee5\u521b\u5efa\u4e2d\u95f4\u4ef6\u7c7b\uff0c\u60a8\u5e94\u8be5\u4f7f\u7528\u54ea\u4e00\u79cd\u5462\uff1f\u55ef\uff0c\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u8981\u6c42\u60a8\u5b66\u4e60\u7279\u5b9a\u7684\u7ea6\u5b9a\u5e76\u8bb0\u4f4f\u5b83\u4eec\u3002\u6ca1\u6709\u7f16\u8bd1\u65f6\u68c0\u67e5\u6765\u786e\u4fdd\u4f60\u7684 middleware \u6b63\u786e\u5b9e\u73b0\u7ea6\u5b9a\u3002\u8fd9\u79cd\u65b9\u6cd5\u79f0\u4e3a\u5f31\u7c7b\u578b\u3002\u901a\u5e38\uff0c\u5f53\u60a8\u7b2c\u4e00\u6b21\u53d1\u73b0\u5fd8\u8bb0\u5c06\u65b9\u6cd5\u547d\u540d\u4e3a Invoke \u6216 InvokeAsync \u6216\u7b2c\u4e00\u4e2a\u53c2\u6570\u5e94\u8be5\u662f HttpContext \u65f6\uff0c\u5b83\u4f1a\u5d29\u6e83\u3002\u5982\u679c\u4f60\u548c\u6211\u4e00\u6837\uff0c\u4f60\u7ecf\u5e38\u4f1a\u53d1\u73b0\u4f60\u5f97\u56de\u5934\u67e5\u9605\u6587\u6863\uff0c\u4ee5\u63d0\u9192\u81ea\u5df1\u7ea6\u5b9a\u7684\u7ec6\u8282\u3002<\/p>\n<p>\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u4f1a\u4ea7\u751f\u5f3a\u7c7b\u578b\u4e2d\u95f4\u4ef6\uff0c\u56e0\u4e3a\u60a8\u5fc5\u987b\u5b9e\u73b0 IMiddleware \u63a5\u53e3\u7684\u6210\u5458;\u5426\u5219\uff0c\u7f16\u8bd1\u5668\u4f1a\u62b1\u6028\uff0c\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u751a\u81f3\u4e0d\u4f1a\u6784\u5efa\u3002\u56e0\u6b64\uff0cIMiddleware \u65b9\u6cd5\u4e0d\u592a\u5bb9\u6613\u51fa\u9519\uff0c\u5e76\u4e14\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u66f4\u5feb\uff0c\u5c3d\u7ba1\u60a8\u5fc5\u987b\u91c7\u53d6\u989d\u5916\u7684\u6b65\u9aa4\u6765\u5411\u670d\u52a1\u5bb9\u5668\u6ce8\u518c\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u8fd9\u4e24\u79cd\u65b9\u6cd5\u4e4b\u95f4\u8fd8\u6709\u53e6\u4e00\u4e2a\u533a\u522b\u3002\u6211\u4e4b\u524d\u63d0\u5230\u8fc7\uff0c\u5728\u9996\u6b21\u6784\u5efa\u7ba1\u9053\u65f6\uff0c\u57fa\u4e8e\u7ea6\u5b9a\u7684\u4e2d\u95f4\u4ef6\u88ab\u5b9e\u4f8b\u5316\u4e3a\u5355\u4f8b\u3002IMiddleware \u7ec4\u4ef6\u7531\u5b9e\u73b0 IMiddlewareFactory \u63a5\u53e3\u7684\u7ec4\u4ef6\u9488\u5bf9\u6bcf\u4e2a\u8bf7\u6c42\u8fdb\u884c\u5b9e\u4f8b\u5316\uff0c\u5e76\u4e14\u8fd9\u79cd\u5dee\u5f02\u4f1a\u6839\u636e\u4e2d\u95f4\u4ef6\u7684\u751f\u5b58\u671f\u5bf9\u4e2d\u95f4\u4ef6\u6240\u4f9d\u8d56\u7684\u670d\u52a1\u4ea7\u751f\u5f71\u54cd\u3002\u6211\u5728\u7b2c 7 \u7ae0\u4e2d\u66f4\u8be6\u7ec6\u5730\u89e3\u91ca\u4e86\u670d\u52a1\u751f\u547d\u5468\u671f\u3002\u73b0\u5728\uff0c\u8bf7\u7406\u89e3 lifetime \u4e0d\u662f singleton \u7684\u670d\u52a1\u4e0d\u5e94\u8be5\u88ab\u6ce8\u5165\u5230 singleton \u7684\u6784\u9020\u51fd\u6570\u4e2d\u3002\u8fd9\u610f\u5473\u7740\u975e\u5355\u4f8b\u670d\u52a1\u4e0d\u5e94\u8be5\u88ab\u6ce8\u5165\u5230\u57fa\u4e8e\u7ea6\u5b9a\u7684\u4e2d\u95f4\u4ef6\u7684\u6784\u9020\u51fd\u6570\u4e2d\u3002\u4f46\u662f\uff0c\u5b83\u4eec\u53ef\u4ee5\u6ce8\u5165\u5230 IMiddleware \u7ec4\u4ef6\u7684\u6784\u9020\u51fd\u6570\u4e2d\u3002\u8bf7\u6ce8\u610f\uff0c\u53ef\u4ee5\u5c06\u975e\u5355\u4f8b\u670d\u52a1\u5b89\u5168\u5730\u6ce8\u5165\u5230\u57fa\u4e8e\u7ea6\u5b9a\u7684\u4e2d\u95f4\u4ef6\u7684 Invoke\/InvokeAsync \u65b9\u6cd5\u4e2d\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5927\u591a\u6570\u6846\u67b6\u4e2d\u95f4\u4ef6\u90fd\u662f\u4f7f\u7528\u57fa\u4e8e\u7ea6\u5b9a\u7684\u65b9\u6cd5\u7f16\u5199\u7684\u3002\u8fd9\u4e3b\u8981\u662f\u56e0\u4e3a\u5b83\u5927\u90e8\u5206\u662f\u5728\u5f15\u5165 IMiddleware \u4e4b\u524d\u7f16\u5199\u7684\u3002\u867d\u7136\u6ca1\u6709\u8ff9\u8c61\u8868\u660e\u6846\u67b6\u8bbe\u8ba1\u4eba\u5458\u8ba4\u4e3a\u6709\u5fc5\u8981\u5c06\u73b0\u6709\u7ec4\u4ef6\u8fc1\u79fb\u5230 IMiddleware\uff0c\u4f46\u4ed6\u4eec\u5efa\u8bae\u60a8\u5c06 IMiddleware \u7528\u4e8e\u60a8\u81ea\u5df1\u521b\u5efa\u7684\u4efb\u4f55\u4e2d\u95f4\u4ef6\u3002<\/p>\n<p>\u6211\u4eec\u5df2\u7ecf\u8be6\u7ec6\u7814\u7a76\u4e86\u5982\u4f55\u4f7f\u7528\u4e2d\u95f4\u4ef6\u6765\u6784\u5efa\u8bf7\u6c42\u7ba1\u9053\uff0c\u4f46\u5c1a\u672a\u771f\u6b63\u8be6\u7ec6\u5730\u4ecb\u7ecd\u5df2\u6dfb\u52a0\u5230\u9ed8\u8ba4\u9879\u76ee\u6a21\u677f\u4e2d\u7684\u4e2d\u95f4\u4ef6\u3002\u8fd9\u5c06\u5728\u63a5\u4e0b\u6765\u7684\u7ae0\u8282\u4e2d\u66f4\u6df1\u5165\u5730\u4ecb\u7ecd\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5c06\u5728\u7b2c 4 \u7ae0\u4e2d\u4ecb\u7ecd\u8def\u7531\u548c\u7aef\u70b9\u4e2d\u95f4\u4ef6\u5982\u4f55\u7ec4\u5408\uff0c\u5728\u7b2c 10 \u7ae0\u4e2d\u4ecb\u7ecd\u6388\u6743\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u5728\u7b2c 12 \u7ae0\u4e2d\u4ecb\u7ecd\u5982\u4f55\u7ba1\u7406\u81ea\u5b9a\u4e49\u9519\u8bef\u9875\u9762\u3002<\/p>\n<h2>\u603b\u7ed3<\/h2>\n<p>Razor Pages \u5e94\u7528\u7a0b\u5e8f\u7684\u8d77\u70b9\u57fa\u4e8e\u6a21\u677f\u3002<br \/>\nRazor Pages \u5e94\u7528\u7a0b\u5e8f\u521b\u5efa\u4e3a\u9879\u76ee\u3002<br \/>\n\u89e3\u51b3\u65b9\u6848\u662f\u7528\u4e8e\u7ba1\u7406\u9879\u76ee\u7684\u5bb9\u5668\u3002<br \/>\nRazor \u8bed\u6cd5\u53ef\u7528\u4e8e\u5411\u9875\u9762\u6dfb\u52a0\u52a8\u6001\u5185\u5bb9\u3002<br \/>\nRazor \u8bed\u6cd5\u652f\u6301\u5c06 C# \u4ee3\u7801\u5d4c\u5165\u5230 HTML \u4e2d\u3002<br \/>\nRazor \u8fd0\u884c\u65f6\u7f16\u8bd1\u901a\u8fc7\u5237\u65b0\u6d4f\u89c8\u5668\u4f7f\u5bf9 Razor \u6587\u4ef6\u7684\u66f4\u6539\u53ef\u89c1\u3002<br \/>\n\u5e03\u5c40\u9875\u9762\u5145\u5f53\u6574\u4e2a\u7f51\u7ad9\u7684\u4e3b\u6a21\u677f\u3002<br \/>\nRazor Pages \u5e94\u7528\u7a0b\u5e8f\u662f\u4ee5 Main \u65b9\u6cd5\u4f5c\u4e3a\u5165\u53e3\u70b9\u7684\u63a7\u5236\u53f0\u5e94\u7528\u7a0b\u5e8f\u3002Main \u65b9\u6cd5\u4f5c\u4e3a C# 10 \u4e2d\u9876\u7ea7\u8bed\u53e5\u529f\u80fd\u7684\u4e00\u90e8\u5206\u9690\u85cf\u5728\u89c6\u56fe\u4e2d\u3002<br \/>\nWebApplicationBuilder \u7528\u4e8e\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u7684\u670d\u52a1\u548c\u8bf7\u6c42\u7ba1\u9053\u3002<br \/>\n\u8bf7\u6c42\u7ba1\u9053\u786e\u5b9a\u5e94\u7528\u7a0b\u5e8f\u7684\u884c\u4e3a\u3002<br \/>\n\u8bf7\u6c42\u7ba1\u9053\u7531\u4e2d\u95f4\u4ef6\u7ec4\u4ef6\u7ec4\u6210\u3002<br \/>\n\u4e2d\u95f4\u4ef6\u4f5c\u4e3a RequestDelegate \u5b9e\u73b0\uff0cRequestDelegate \u662f\u4e00\u4e2a\u5c06 HttpContext \u4f5c\u4e3a\u53c2\u6570\u5e76\u8fd4\u56de Task \u7684\u51fd\u6570\u3002<br \/>\n\u4e2d\u95f4\u4ef6\u901a\u8fc7 WebApplication \u5bf9\u8c61\u6dfb\u52a0\u5230\u7ba1\u9053\u4e2d\u3002\u4e2d\u95f4\u4ef6\u53ef\u4ee5\u7ec8\u6b62\u7ba1\u9053\u6216\u5c06\u63a7\u5236\u6743\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u3002<br \/>\nMiddleware \u5c06\u6309\u7167\u5176\u6ce8\u518c\u987a\u5e8f\u8fdb\u884c\u8c03\u7528\u3002<br \/>\n\u53ef\u4ee5\u4f7f\u7528\u5185\u8054 lambda \u8868\u8fbe\u5f0f\u6dfb\u52a0\u7b80\u5355\u7684\u4e2d\u95f4\u4ef6\u3002<br \/>\n\u590d\u6742\u4e2d\u95f4\u4ef6\u53ef\u4ee5\u521b\u5efa\u4e3a\u5355\u72ec\u7684\u7c7b\uff0c\u5e76\u4f7f\u7528 IApplicationBuilder \u7c7b\u578b\u7684\u6269\u5c55\u65b9\u6cd5\u8fdb\u884c\u6ce8\u518c\u3002<br \/>\n\u4e2d\u95f4\u4ef6\u7c7b\u5e94\u4f7f\u7528\u7ea6\u5b9a\u6216\u5b9e\u73b0 IMiddleware \u63a5\u53e3\u3002<br \/>\n\u57fa\u4e8e\u7ea6\u5b9a\u7684\u4e2d\u95f4\u4ef6\u5b9e\u4f8b\u5316\u4e3a\u5355\u4e00\u5b9e\u4f8b\uff0c\u5e76\u4e14\u5e94\u8be5\u901a\u8fc7 Invoke\/InvokeAsync \u65b9\u6cd5\u83b7\u53d6\u4f9d\u8d56\u9879\u3002<br \/>\nIMiddleware \u6309\u8bf7\u6c42\u5b9e\u4f8b\u5316\uff0c\u5e76\u4e14\u53ef\u4ee5\u901a\u8fc7\u5176\u6784\u9020\u51fd\u6570\u83b7\u53d6\u4f9d\u8d56\u9879\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ASP.NET Core Razor Pages in Action 2 \u6784\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f \u672c\u7ae0\u6db5\u76d6 \u2022 \u521b\u5efa Razor Pages \u5e94\u7528\u7a0b\u5e8f \u2022 \u6dfb\u52a0\u60a8\u7684\u7b2c\u4e00\u4e2a\u9875\u9762 \u2022 \u63a2\u7d22\u9879\u76ee\u6587\u4ef6\u53ca\u5176\u6240\u626e\u6f14\u7684\u89d2\u8272 \u2022 \u4f7f\u7528\u4e2d\u95f4\u4ef6\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u7ba1\u9053 \u5728\u4e0a\u4e00\u7ae0\u4e2d\uff0c\u4f60\u4e86\u89e3\u4e86 Razor Pages Web \u5f00\u53d1\u6846\u67b6\uff08\u4f5c\u4e3a ASP.NET Core \u7684\u4e00\u90e8\u5206\uff09\u5982\u4f55\u9002\u5e94\u6574\u4e2a .NET Framework\u3002\u60a8\u5df2\u7ecf\u53d1\u73b0\u4e86\u53ef\u4ee5\u4f7f\u7528 Razor Pages \u6784\u5efa\u7684\u5e94\u7528\u7a0b\u5e8f\u7c7b\u578b\uff0c\u800c\u4e14\u91cd\u8981\u7684\u662f\uff0c\u5f53\u5b83\u4e0d\u662f\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u65f6\u3002\u60a8\u5df2\u7ecf\u4e86\u89e3\u4e86\u4f7f\u7528 Razor Pages \u9ad8\u6548\u5de5\u4f5c\u6240\u9700\u7684\u5de5\u5177\uff0c\u5e76\u5e0c\u671b\u4e0b\u8f7d\u5e76\u5b89\u88c5\u4e86 Visual Studio \u6216 VS Code \u4ee5\u53ca\u6700\u65b0\u7248\u672c\u7684 .NET SDK\u3002\u73b0\u5728\u60a8\u5df2\u7ecf\u8bbe\u7f6e\u4e86\u5f00\u53d1\u73af\u5883\uff0c\u662f\u65f6\u5019\u5f00\u59cb\u4f7f\u7528\u4ee3\u7801\u4e86\u3002 \u5728\u672c\u7ae0\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528 Visual Studio \u548c CLI \u521b\u5efa\u60a8\u7684\u7b2c\u4e00\u4e2a Razor Pages \u5e94\u7528\u7a0b\u5e8f\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5728\u6240\u9009\u7684\u4f5c\u7cfb\u7edf\u4e0a\u8fdb\u884c\u4f5c\u3002\u5927\u591a\u6570 Web \u5f00\u53d1\u6846\u67b6\u90fd\u63d0\u4f9b\u521d\u5b66\u8005\u5de5\u5177\u5305\u6216\u9879\u76ee [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1058","post","type-post","status-publish","format-standard","hentry","category-csharp"],"_links":{"self":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts\/1058","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1058"}],"version-history":[{"count":0,"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts\/1058\/revisions"}],"wp:attachment":[{"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}