{"id":1249,"date":"2024-12-04T09:59:33","date_gmt":"2024-12-04T00:59:33","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1249"},"modified":"2025-03-24T08:52:22","modified_gmt":"2025-03-23T23:52:22","slug":"%e3%80%90%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%e3%80%91asp-net-core-%e5%85%a5%e9%96%80%e3%81%8b%e3%82%89%e5%ae%9f%e8%b7%b5%e3%81%be%e3%81%a7-%e7%8f%be%e5%bd%b9%e3%82%a8%e3%83%b3%e3%82%b8","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1249","title":{"rendered":"\u3010\u5b8c\u5168\u30ac\u30a4\u30c9\u3011ASP.NET Core \u5165\u9580\u304b\u3089\u5b9f\u8df5\u307e\u3067 &#8211; \u73fe\u5f79\u30a8\u30f3\u30b8\u30cb\u30a2\u304c\u89e3\u8aac\u3059\u308b\u958b\u767a\u52b9\u7387\u5316\u306e\u6975\u610f"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">\u306f\u3058\u3081\u306b<\/a>  <\/li>  <li>    <a href=\"#i-1\">ASP.NET Core\u3068\u306f\u4f55\u304b \u2013 \u30e2\u30c0\u30f3Web\u958b\u767a\u306e\u65b0\u6a19\u6e96<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-2\">\u5f93\u6765\u306e.NET Framework\u3068\u306e\u6c7a\u5b9a\u7684\u306a\u9055\u3044<\/a>      <\/li>      <li>        <a href=\"#i-3\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306b\u3088\u308b\u65b0\u305f\u306a\u53ef\u80fd\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-4\">\u9ad8\u901f\u3067\u8efd\u91cf\u306a\u5b9f\u884c\u74b0\u5883\u306e\u5b9f\u73fe\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">ASP.NET Core\u3067\u4f5c\u308b\u6700\u65b0\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-13\">Model-View-Controller\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u4f9d\u5b58\u6027\u6ce8\u5165\u3092\u6d3b\u7528\u3057\u305f\u758e\u7d50\u5408\u306a\u8a2d\u8a08\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u5316\u3059\u308bASP.NET Core\u306e\u6a5f\u80fd<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-22\">\u975e\u540c\u671f\u51e6\u7406\u306b\u3088\u308b\u5fdc\u7b54\u6027\u306e\u5411\u4e0a\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-25\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6a5f\u80fd\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-29\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u6226\u7565<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-32\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-33\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-36\">\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30b9\u30af\u30ea\u30d7\u30c6\u30a3\u30f3\u30b0\u5bfe\u7b56\u306e\u5b9f\u8df5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-39\">\u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u3068\u30c7\u30fc\u30bf\u4fdd\u8b77\u306e\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-42\">\u5b9f\u8df5\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-43\">Entity Framework\u3092\u4f7f\u7528\u3057\u305fCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-46\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306b\u3088\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u7ba1\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-49\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30af\u30a8\u30ea\u6700\u9069\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-52\">\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u3068CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-53\">Docker\u30b3\u30f3\u30c6\u30ca\u3092\u4f7f\u7528\u3057\u305f\u5c55\u958b\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-56\">\u30af\u30e9\u30a6\u30c9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u624b\u9806<\/a>      <\/li>      <li>        <a href=\"#i-59\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u7d99\u7d9a\u7684\u30c7\u30d7\u30ed\u30a4\u306e\u69cb\u7bc9<\/a>      <\/li>      <li>        <a href=\"#i-62\">\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u306e\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-66\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6226\u7565\u306e\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-70\">\u6700\u5f8c\u306b<\/a>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">\u306f\u3058\u3081\u306b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001Microsoft\u304c\u63d0\u4f9b\u3059\u308b\u6700\u65b0\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u3001\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3001\u305d\u3057\u3066\u8c4a\u5bcc\u306a\u6a5f\u80fd\u3092\u5099\u3048\u3066\u304a\u308a\u3001\u30e2\u30c0\u30f3\u306aWeb\u958b\u767a\u306b\u6700\u9069\u306a\u30c4\u30fc\u30eb\u3068\u3057\u3066\u6ce8\u76ee\u3092\u96c6\u3081\u3066\u3044\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001ASP.NET Core\u306e\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u7684\u306a\u958b\u767a\u624b\u6cd5\u307e\u3067\u3001\u73fe\u5f79\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u8996\u70b9\u3067\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u3093\u3060\u3089\u308f\u304b\u308b\u3053\u3068\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u672c\u8a18\u4e8b\u3067\u5b66\u3079\u308b\u3053\u3068<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\">\n<li>ASP.NET Core\u306e\u57fa\u672c\u6982\u5ff5\u3068\u5f93\u6765\u306e.NET Framework\u3068\u306e\u9055\u3044<\/li>\n\n\n\n<li>MVC\u30d1\u30bf\u30fc\u30f3\u3092\u7528\u3044\u305f\u5b9f\u8df5\u7684\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u306e\u65b9\u6cd5<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3068\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6539\u5584\u30c6\u30af\u30cb\u30c3\u30af<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u5177\u4f53\u7684\u306a\u9632\u5fa1\u624b\u6bb5<\/li>\n\n\n\n<li>Entity Framework Core\u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a\u306e\u5b9f\u8df5\u624b\u6cd5<\/li>\n\n\n\n<li>Docker\u3068CI\/CD\u3092\u6d3b\u7528\u3057\u305f\u30e2\u30c0\u30f3\u306a\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u624b\u6cd5<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-1\">ASP.NET Core\u3068\u306f\u4f55\u304b \u2013 \u30e2\u30c0\u30f3Web\u958b\u767a\u306e\u65b0\u6a19\u6e96<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001Microsoft\u304c\u958b\u767a\u3057\u305f\u6700\u65b0\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002\u5f93\u6765\u306e.NET Framework\u3092\u57fa\u76e4\u3068\u3059\u308bASP.NET\u3068\u306f\u7570\u306a\u308a\u3001\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u3067\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u65b0\u3057\u3044\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u3057\u3066\u8a2d\u8a08\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u5f93\u6765\u306e.NET Framework\u3068\u306e\u6c7a\u5b9a\u7684\u306a\u9055\u3044<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u3068ASP.NET Framework\u306e\u4e3b\u8981\u306a\u9055\u3044\u306f\u4ee5\u4e0b\u306e\u70b9\u306b\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-6cdccfb9-d708-4466-86e7-65205d6bd12e\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u5fb4<\/th><th>ASP.NET Core<\/th><th>ASP.NET Framework<\/th><\/tr><\/thead><tbody><tr><td>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0<\/td><td>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff08Windows, Linux, macOS\uff09<\/td><td>Windows\u306e\u307f<\/td><\/tr><tr><td>\u4f9d\u5b58\u6027<\/td><td>\u5b8c\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\uff08\u5fc5\u8981\u306a\u6a5f\u80fd\u306e\u307f\u5c0e\u5165\u53ef\u80fd\uff09<\/td><td>\u30e2\u30ce\u30ea\u30b7\u30c3\u30af\uff08\u5168\u6a5f\u80fd\u304c\u7d71\u5408\uff09<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u9ad8\u901f\uff08\u8efd\u91cf\u8a2d\u8a08\uff09<\/td><td>\u6bd4\u8f03\u7684\u91cd\u3044<\/td><\/tr><tr><td>\u958b\u767a\u65b9\u5f0f<\/td><td>\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9<\/td><td>\u30d7\u30ed\u30d7\u30e9\u30a4\u30a8\u30bf\u30ea<\/td><\/tr><tr><td>\u30c7\u30d7\u30ed\u30a4<\/td><td>\u67d4\u8edf\uff08\u81ea\u5df1\u5b8c\u7d50\u578b\u5c55\u958b\u53ef\u80fd\uff09<\/td><td>IIS\u4f9d\u5b58<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\u7279\u7b46\u3059\u3079\u304d\u70b9\u3068\u3057\u3066\u3001ASP.NET Core\u3067\u306f\u5fc5\u8981\u306a\u6a5f\u80fd\u306e\u307f\u3092\u9078\u629e\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u308b\u300cPay-for-what-you-use\u300d\u30e2\u30c7\u30eb\u3092\u63a1\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5\u6642\u9593\u304c\u77ed\u7e2e\u3055\u308c\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3082\u6700\u9069\u5316\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306b\u3088\u308b\u65b0\u305f\u306a\u53ef\u80fd\u6027<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306e\u6700\u5927\u306e\u7279\u5fb4\u306f\u3001\u771f\u306e\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u958b\u767a\u30b7\u30ca\u30ea\u30aa\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u306e\u81ea\u7531\u306a\u9078\u629e\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>Visual Studio Code\uff08Windows\/Mac\/Linux\uff09<\/li>\n\n\n\n<li>Visual Studio\uff08Windows\/Mac\uff09<\/li>\n\n\n\n<li>JetBrains Rider\uff08\u5168\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff09<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u5148\u306e\u67d4\u8edf\u306a\u9078\u629e\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>Linux\u7cfb\u30b5\u30fc\u30d0\u30fc<\/li>\n\n\n\n<li>Windows Server<\/li>\n\n\n\n<li>Docker\u30b3\u30f3\u30c6\u30ca<\/li>\n\n\n\n<li>\u30af\u30e9\u30a6\u30c9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff08Azure, AWS, GCP\uff09<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210\u30b3\u30de\u30f3\u30c9\u3067\u3001\u3069\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3082\u540c\u3058\u3088\u3046\u306b\u958b\u767a\u3092\u59cb\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bat\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u65b0\u898fWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\ndotnet new webapp -n MyFirstAspNetCoreApp\n\n# API\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\ndotnet new webapi -n MyFirstWebApi<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u9ad8\u901f\u3067\u8efd\u91cf\u306a\u5b9f\u884c\u74b0\u5883\u306e\u5b9f\u73fe\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001\u4ee5\u4e0b\u306e\u6280\u8853\u7684\u7279\u5fb4\u306b\u3088\u308a\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\"><strong>Kestrel\u30b5\u30fc\u30d0\u30fc<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30cd\u30a4\u30c6\u30a3\u30d6\u3067\u9ad8\u6027\u80fd\u306aWeb\u30b5\u30fc\u30d0\u30fc<\/li>\n\n\n\n<li>\u975e\u540c\u671fI\/O\u51e6\u7406\u306b\u3088\u308b\u9ad8\u30b9\u30eb\u30fc\u30d7\u30c3\u30c8<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u9ad8\u3044\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\"><strong>\u6700\u9069\u5316\u3055\u308c\u305f\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void Configure(IApplicationBuilder app)\n{\n    \/\/ \u5fc5\u8981\u6700\u5c0f\u9650\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u307f\u3092\u4f7f\u7528\n    app.UseRouting();\n    app.UseAuthorization();\n    app.UseEndpoints(endpoints =&gt;\n    {\n        endpoints.MapControllers();\n    });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\"><strong>JIT\u30b3\u30f3\u30d1\u30a4\u30eb\u6700\u9069\u5316<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u7279\u6709\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>Tiered Compilation\u306b\u3088\u308b\u5b9f\u884c\u6642\u6700\u9069\u5316<\/li>\n\n\n\n<li>ReadyToRun\u5f62\u5f0f\u306b\u3088\u308b\u8d77\u52d5\u6642\u9593\u306e\u77ed\u7e2e<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\"><strong>\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Span\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u64cd\u4f5c\u306e\u4f8b\npublic void ProcessLargeData(ReadOnlySpan&lt;byte&gt; data)\n{\n    \/\/ \u30b9\u30bf\u30c3\u30af\u30a2\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\n    Span&lt;byte&gt; buffer = stackalloc byte[1024];\n    \/\/ \u30c7\u30fc\u30bf\u51e6\u7406...\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u7279\u5fb4\u306b\u3088\u308a\u3001ASP.NET Core\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6307\u6a19\u3092\u9054\u6210\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30ea\u30af\u30a8\u30b9\u30c8\u51e6\u7406\u901f\u5ea6: \u5f93\u6765\u306e\u7d042\u500d<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf: \u6700\u592750%\u524a\u6e1b<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8d77\u52d5\u6642\u9593: \u7d0430%\u77ed\u7e2e<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001\u3053\u308c\u3089\u306e\u9769\u65b0\u7684\u306a\u7279\u5fb4\u306b\u3088\u308a\u3001\u30e2\u30c0\u30f3\u306aWeb\u958b\u767a\u306e\u65b0\u6a19\u6e96\u3068\u3057\u3066\u6025\u901f\u306b\u666e\u53ca\u3057\u3066\u3044\u307e\u3059\u3002\u7279\u306b\u3001\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3084\u30b3\u30f3\u30c6\u30ca\u5316\u3055\u308c\u305f\u74b0\u5883\u3067\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u305d\u306e\u771f\u4fa1\u3092\u767a\u63ee\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">ASP.NET Core\u3067\u4f5c\u308b\u6700\u65b0\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u3092\u4f7f\u7528\u3057\u305f\u6700\u65b0\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3067\u306f\u3001\u30e2\u30c0\u30f3\u306a\u958b\u767a\u624b\u6cd5\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u62e1\u5f35\u3057\u3084\u3059\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3068\u57fa\u672c\u8a2d\u5b9a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u304b\u3089\u57fa\u672c\u8a2d\u5b9a\u307e\u3067\u3001\u4ee5\u4e0b\u306e\u624b\u9806\u3067\u52b9\u7387\u7684\u306b\u958b\u767a\u74b0\u5883\u3092\u6574\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bat\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># MVC\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\ndotnet new mvc -n ModernWebApp\ncd ModernWebApp\n\n# \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u8ffd\u52a0\ndotnet add package Microsoft.EntityFrameworkCore.SqlServer\ndotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8a2d\u5b9a\u306e\u69cb\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var builder = WebApplication.CreateBuilder(args);\n\n\/\/ \u30b5\u30fc\u30d3\u30b9\u306e\u8ffd\u52a0\nbuilder.Services.AddControllersWithViews();\nbuilder.Services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;\n    options.UseSqlServer(builder.Configuration.GetConnectionString(\"DefaultConnection\")));\n\n\/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u69cb\u7bc9\nvar app = builder.Build();\n\n\/\/ \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u8a2d\u5b9a\nif (!app.Environment.IsDevelopment())\n{\n    app.UseExceptionHandler(\"\/Home\/Error\");\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\napp.UseRouting();\napp.UseAuthorization();\n\napp.MapControllerRoute(\n    name: \"default\",\n    pattern: \"{controller=Home}\/{action=Index}\/{id?}\");\n\napp.Run();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">Model-View-Controller\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MVC\u30d1\u30bf\u30fc\u30f3\u306e\u52b9\u679c\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">\u30e2\u30c7\u30eb\u306e\u5b9a\u7fa9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Product\n{\n    public int Id { get; set; }\n\n    [Required]\n    [StringLength(100)]\n    public string Name { get; set; }\n\n    [Range(0, 1000000)]\n    public decimal Price { get; set; }\n\n    public string Description { get; set; }\n\n    [DataType(DataType.Date)]\n    public DateTime CreatedDate { get; set; }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ProductController : Controller\n{\n    private readonly IProductService _productService;\n    private readonly ILogger&lt;ProductController&gt; _logger;\n\n    public ProductController(IProductService productService, ILogger&lt;ProductController&gt; logger)\n    {\n        _productService = productService;\n        _logger = logger;\n    }\n\n    public async Task&lt;IActionResult&gt; Index()\n    {\n        try\n        {\n            var products = await _productService.GetAllProductsAsync();\n            return View(products);\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, \"\u88fd\u54c1\u4e00\u89a7\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\");\n            return StatusCode(500);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@model IEnumerable&lt;ModernWebApp.Models.Product&gt;\n\n&lt;div class=\"container\"&gt;\n    &lt;h2&gt;\u88fd\u54c1\u4e00\u89a7&lt;\/h2&gt;\n    &lt;div class=\"row\"&gt;\n        @foreach (var product in Model)\n        {\n            &lt;div class=\"col-md-4 mb-4\"&gt;\n                &lt;div class=\"card\"&gt;\n                    &lt;div class=\"card-body\"&gt;\n                        &lt;h5 class=\"card-title\"&gt;@product.Name&lt;\/h5&gt;\n                        &lt;p class=\"card-text\"&gt;@product.Description&lt;\/p&gt;\n                        &lt;p class=\"card-text\"&gt;\n                            &lt;strong&gt;\u4fa1\u683c:&lt;\/strong&gt; @product.Price.ToString(\"C\")\n                        &lt;\/p&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        }\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u4f9d\u5b58\u6027\u6ce8\u5165\u3092\u6d3b\u7528\u3057\u305f\u758e\u7d50\u5408\u306a\u8a2d\u8a08\u624b\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306e\u4f9d\u5b58\u6027\u6ce8\u5165\uff08DI\uff09\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">\u30b5\u30fc\u30d3\u30b9\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9a\u7fa9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public interface IProductService\n{\n    Task&lt;IEnumerable&lt;Product&gt;&gt; GetAllProductsAsync();\n    Task&lt;Product&gt; GetProductByIdAsync(int id);\n    Task&lt;Product&gt; CreateProductAsync(Product product);\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">\u30b5\u30fc\u30d3\u30b9\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ProductService : IProductService\n{\n    private readonly ApplicationDbContext _context;\n    private readonly IMapper _mapper;\n\n    public ProductService(ApplicationDbContext context, IMapper mapper)\n    {\n        _context = context;\n        _mapper = mapper;\n    }\n\n    public async Task&lt;IEnumerable&lt;Product&gt;&gt; GetAllProductsAsync()\n    {\n        return await _context.Products\n            .AsNoTracking()\n            .OrderByDescending(p =&gt; p.CreatedDate)\n            .ToListAsync();\n    }\n\n    \/\/ \u4ed6\u306e\u30e1\u30bd\u30c3\u30c9\u5b9f\u88c5...\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">DI\u30b3\u30f3\u30c6\u30ca\u3078\u306e\u767b\u9332<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddScoped&lt;IProductService, ProductService&gt;();\nbuilder.Services.AddAutoMapper(typeof(Program).Assembly);\nbuilder.Services.AddScoped&lt;IEmailService, EmailService&gt;();\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u306e\u6ce8\u5165\nbuilder.Services.Configure&lt;EmailSettings&gt;(\n    builder.Configuration.GetSection(\"EmailSettings\"));<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u3088\u3046\u306a\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u30e1\u30ea\u30c3\u30c8\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u758e\u7d50\u5408\u306a\u8a2d\u8a08\u624b\u6cd5\u306e\u30e1\u30ea\u30c3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-good-alt wp-block-paragraph\">\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u306e\u5411\u4e0a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-good-alt wp-block-paragraph\">\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u518d\u5229\u7528\u6027<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-good-alt wp-block-paragraph\">\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-good-alt wp-block-paragraph\">\u5b9f\u88c5\u306e\u67d4\u8edf\u6027<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306e\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u52b9\u7387\u7684\u306b\u958b\u767a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u5316\u3059\u308bASP.NET Core\u306e\u6a5f\u80fd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u591a\u69d8\u306a\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u9069\u5207\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5fdc\u7b54\u6027\u3068\u51e6\u7406\u80fd\u529b\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u975e\u540c\u671f\u51e6\u7406\u306b\u3088\u308b\u5fdc\u7b54\u6027\u306e\u5411\u4e0a\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u975e\u540c\u671f\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3092\u52b9\u679c\u7684\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3068\u5fdc\u7b54\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">\u975e\u540c\u671f\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ProductController : Controller\n{\n    private readonly IProductService _productService;\n\n    public ProductController(IProductService productService)\n    {\n        _productService = productService;\n    }\n\n    \/\/ \u975e\u540c\u671f\u30a2\u30af\u30b7\u30e7\u30f3\u30e1\u30bd\u30c3\u30c9\n    public async Task&lt;IActionResult&gt; Index()\n    {\n        \/\/ ConfigureAwait(false)\u3092\u4f7f\u7528\u3057\u3066\u4e0d\u8981\u306a\u540c\u671f\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u5207\u308a\u66ff\u3048\u3092\u9632\u3050\n        var products = await _productService.GetProductsAsync().ConfigureAwait(false);\n        return View(products);\n    }\n\n    \/\/ \u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u975e\u540c\u671f\u51e6\u7406\n    public async Task&lt;IActionResult&gt; Dashboard()\n    {\n        var tasks = new[]\n        {\n            _productService.GetTotalSalesAsync(),\n            _productService.GetTopProductsAsync(),\n            _productService.GetRecentOrdersAsync()\n        };\n\n        \/\/ \u8907\u6570\u306e\u975e\u540c\u671f\u51e6\u7406\u3092\u4e26\u5217\u5b9f\u884c\n        await Task.WhenAll(tasks);\n\n        var viewModel = new DashboardViewModel\n        {\n            TotalSales = tasks[0].Result,\n            TopProducts = tasks[1].Result,\n            RecentOrders = tasks[2].Result\n        };\n\n        return View(viewModel);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">\u975e\u540c\u671f\u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406\u306e\u6d3b\u7528<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public async IAsyncEnumerable&lt;Product&gt; GetProductStreamAsync()\n{\n    await using var context = new ProductContext();\n    var products = context.Products.AsAsyncEnumerable();\n\n    await foreach (var product in products)\n    {\n        \/\/ \u5927\u91cf\u30c7\u30fc\u30bf\u3092\u5c11\u3057\u305a\u3064\u51e6\u7406\n        yield return product;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6a5f\u80fd\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001\u8907\u6570\u306e\u30ec\u30d9\u30eb\u3067\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">\u30e1\u30e2\u30ea\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CacheProductService : IProductService\n{\n    private readonly IMemoryCache _cache;\n    private readonly IProductRepository _repository;\n\n    public async Task&lt;Product&gt; GetProductByIdAsync(int id)\n    {\n        string cacheKey = $\"product_{id}\";\n\n        return await _cache.GetOrCreateAsync(cacheKey, async entry =&gt;\n        {\n            entry.SetAbsoluteExpiration(TimeSpan.FromMinutes(10));\n            entry.SetSlidingExpiration(TimeSpan.FromMinutes(2));\n\n            return await _repository.GetProductByIdAsync(id);\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">\u5206\u6563\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u8a2d\u5b9a\uff08Redis\u4f7f\u7528\uff09<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    services.AddStackExchangeRedisCache(options =&gt;\n    {\n        options.Configuration = Configuration.GetConnectionString(\"Redis\");\n        options.InstanceName = \"ProductCache_\";\n    });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">\u30ec\u30b9\u30dd\u30f3\u30b9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Any)]\npublic async Task&lt;IActionResult&gt; ProductList()\n{\n    var products = await _productService.GetProductsAsync();\n    return View(products);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u6226\u7565<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u4e3b\u8981\u306a\u6226\u7565\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30d7\u30fc\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApiController : Controller\n{\n    private readonly ObjectPool&lt;StringBuilder&gt; _stringBuilderPool;\n\n    public ApiController(ObjectPoolProvider poolProvider)\n    {\n        _stringBuilderPool = poolProvider.CreateStringBuilderPool();\n    }\n\n    public IActionResult ProcessData(string data)\n    {\n        var sb = _stringBuilderPool.Get();\n        try\n        {\n            \/\/ StringBuilder \u3092\u4f7f\u7528\u3057\u305f\u51e6\u7406\n            sb.Append(\"\u51e6\u7406\u7d50\u679c: \").Append(data);\n            return Ok(sb.ToString());\n        }\n        finally\n        {\n            _stringBuilderPool.Return(sb);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class DataProcessor\n{\n    \/\/ \u5927\u304d\u306a\u914d\u5217\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\n    public async Task ProcessLargeDataAsync(Stream stream)\n    {\n        const int bufferSize = 4096;\n        using var memoryStream = new MemoryStream();\n\n        Memory&lt;byte&gt; buffer = new byte[bufferSize];\n        int bytesRead;\n\n        while ((bytesRead = await stream.ReadAsync(buffer)) &gt; 0)\n        {\n            await memoryStream.WriteAsync(buffer[..bytesRead]);\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u6280\u8853\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001ASP.NET Core\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6027\u80fd\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u91cd\u8981\u306a\u6307\u6a19\u3092\u76e3\u8996<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30b9\u30eb\u30fc\u30d7\u30c3\u30c8<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">GC\u306e\u983b\u5ea6<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a\u3068\u5bfe\u7b56<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb\u306e\u6d3b\u7528<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\u306e\u5b9f\u65bd<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u7d99\u7d9a\u7684\u306a\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-32\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306b\u306f\u3001\u5805\u7262\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd\u304c\u7d44\u307f\u8fbc\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u9069\u5207\u306a\u5b9f\u88c5\u306b\u3088\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69d8\u3005\u306a\u8105\u5a01\u304b\u3089\u4fdd\u8b77\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">Identity\u6a5f\u80fd\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    services.AddIdentity&lt;ApplicationUser, IdentityRole&gt;(options =&gt;\n    {\n        \/\/ \u30d1\u30b9\u30ef\u30fc\u30c9\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a\n        options.Password.RequireDigit = true;\n        options.Password.RequireLowercase = true;\n        options.Password.RequireUppercase = true;\n        options.Password.RequireNonAlphanumeric = true;\n        options.Password.MinLength = 12;\n\n        \/\/ \u30ed\u30c3\u30af\u30a2\u30a6\u30c8\u30dd\u30ea\u30b7\u30fc\n        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(15);\n        options.Lockout.MaxFailedAccessAttempts = 5;\n    })\n    .AddEntityFrameworkStores&lt;ApplicationDbContext&gt;()\n    .AddDefaultTokenProviders();\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">JWT\u8a8d\u8a3c\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class AuthenticationService : IAuthenticationService\n{\n    private readonly IConfiguration _configuration;\n    private readonly UserManager&lt;ApplicationUser&gt; _userManager;\n\n    public async Task&lt;string&gt; GenerateJwtToken(ApplicationUser user)\n    {\n        var claims = new List&lt;Claim&gt;\n        {\n            new Claim(ClaimTypes.NameIdentifier, user.Id),\n            new Claim(ClaimTypes.Email, user.Email),\n            new Claim(ClaimTypes.Role, \"User\")\n        };\n\n        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(\n            _configuration[\"JWT:SecretKey\"]));\n        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n        var token = new JwtSecurityToken(\n            issuer: _configuration[\"JWT:Issuer\"],\n            audience: _configuration[\"JWT:Audience\"],\n            claims: claims,\n            expires: DateTime.Now.AddHours(1),\n            signingCredentials: credentials\n        );\n\n        return new JwtSecurityTokenHandler().WriteToken(token);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30b9\u30af\u30ea\u30d7\u30c6\u30a3\u30f3\u30b0\u5bfe\u7b56\u306e\u5b9f\u8df5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">XSS\u9632\u5fa1\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    services.AddAntiforgery(options =&gt;\n    {\n        options.Cookie.Name = \"X-CSRF-TOKEN\";\n        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;\n    });\n\n    services.Configure&lt;HtmlEncoderOptions&gt;(options =&gt;\n    {\n        options.HtmlAttributeEncode = true;\n    });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">CSP\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void Configure(IApplicationBuilder app)\n{\n    app.Use(async (context, next) =&gt;\n    {\n        context.Response.Headers.Add(\n            \"Content-Security-Policy\",\n            \"default-src 'self'; \" +\n            \"script-src 'self' 'unsafe-inline' 'unsafe-eval'; \" +\n            \"style-src 'self' 'unsafe-inline';\"\n        );\n        await next();\n    });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u3068\u30c7\u30fc\u30bf\u4fdd\u8b77\u306e\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">\u30c7\u30fc\u30bf\u4fdd\u8b77API\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class SecureDataService\n{\n    private readonly IDataProtector _protector;\n\n    public SecureDataService(IDataProtectionProvider provider)\n    {\n        _protector = provider.CreateProtector(\"SecureData.v1\");\n    }\n\n    public string ProtectData(string data)\n    {\n        return _protector.Protect(data);\n    }\n\n    public string UnprotectData(string protectedData)\n    {\n        return _protector.Unprotect(protectedData);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">\u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        \/\/ \u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u306e\u7ba1\u7406\n        services.AddDataProtection()\n            .PersistKeysToFileSystem(new DirectoryInfo(@\"path\\to\\keys\"))\n            .SetDefaultKeyLifetime(TimeSpan.FromDays(90));\n\n        \/\/ HTTPS\u30ea\u30c0\u30a4\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u5f37\u5236\n        services.AddHttpsRedirection(options =&gt;\n        {\n            options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;\n            options.HttpsPort = 443;\n        });\n\n        \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\n        services.AddSession(options =&gt;\n        {\n            options.Cookie.Name = \".MyApp.Session\";\n            options.Cookie.HttpOnly = true;\n            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;\n            options.IdleTimeout = TimeSpan.FromMinutes(20);\n        });\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69d8\u3005\u306a\u8105\u5a01\u304b\u3089\u4fdd\u8b77\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u306e\u5b89\u5168\u6027\u3092\u78ba\u4fdd\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ol class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\n<ul class=\"wp-block-list\">\n<li>HTTPS\u306e\u5f37\u5236<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u30af\u30c3\u30ad\u30fc\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>XSS\u5bfe\u7b56\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>CSRF\u5bfe\u7b56\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u4fdd\u8b77\n<ul class=\"wp-block-list\">\n<li>\u6a5f\u5bc6\u30c7\u30fc\u30bf\u306e\u6697\u53f7\u5316<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u30ad\u30fc\u306e\u5b9a\u671f\u7684\u306a\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u6697\u53f7\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u76e3\u8996\u3068\u30ed\u30b0\u8a18\u9332\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30a4\u30d9\u30f3\u30c8\u306e\u30ed\u30b0\u8a18\u9332<\/li>\n\n\n\n<li>\u7570\u5e38\u691c\u77e5\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u76e3\u67fb\u30ed\u30b0\u306e\u4fdd\u8b77<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-42\">\u5b9f\u8df5\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u3067\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a\u306f\u3001\u4e3b\u306bEntity Framework Core\uff08EF Core\uff09\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u3057\u307e\u3059\u3002\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u3068\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u624b\u6cd5\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">Entity Framework\u3092\u4f7f\u7528\u3057\u305fCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">DbContext\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationDbContext : DbContext\n{\n    public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options)\n        : base(options)\n    {\n    }\n\n    public DbSet&lt;Product&gt; Products { get; set; }\n    public DbSet&lt;Category&gt; Categories { get; set; }\n\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\n    {\n        \/\/ \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u306e\u8a2d\u5b9a\n        modelBuilder.Entity&lt;Product&gt;()\n            .HasOne(p =&gt; p.Category)\n            .WithMany(c =&gt; c.Products)\n            .HasForeignKey(p =&gt; p.CategoryId);\n\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u8a2d\u5b9a\n        modelBuilder.Entity&lt;Product&gt;()\n            .HasIndex(p =&gt; p.Name);\n\n        \/\/ \u8907\u5408\u30ad\u30fc\u306e\u8a2d\u5b9a\n        modelBuilder.Entity&lt;OrderItem&gt;()\n            .HasKey(oi =&gt; new { oi.OrderId, oi.ProductId });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">\u30ea\u30dd\u30b8\u30c8\u30ea\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ProductRepository : IProductRepository\n{\n    private readonly ApplicationDbContext _context;\n\n    public ProductRepository(ApplicationDbContext context)\n    {\n        _context = context;\n    }\n\n    \/\/ \u975e\u540c\u671f\u3067\u306eCRUD\u64cd\u4f5c\n    public async Task&lt;Product&gt; CreateAsync(Product product)\n    {\n        await _context.Products.AddAsync(product);\n        await _context.SaveChangesAsync();\n        return product;\n    }\n\n    public async Task&lt;Product&gt; UpdateAsync(Product product)\n    {\n        _context.Entry(product).State = EntityState.Modified;\n        await _context.SaveChangesAsync();\n        return product;\n    }\n\n    public async Task&lt;bool&gt; DeleteAsync(int id)\n    {\n        var product = await _context.Products.FindAsync(id);\n        if (product == null) return false;\n\n        _context.Products.Remove(product);\n        await _context.SaveChangesAsync();\n        return true;\n    }\n\n    public async Task&lt;IEnumerable&lt;Product&gt;&gt; GetAllAsync()\n    {\n        return await _context.Products\n            .Include(p =&gt; p.Category)\n            .AsNoTracking()\n            .ToListAsync();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306b\u3088\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u7ba1\u7406<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u3068\u9069\u7528<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bat\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\ndotnet ef migrations add InitialCreate\n\n# \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u9069\u7528\ndotnet ef database update<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\u306e\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public partial class AddProductInventory : Migration\n{\n    protected override void Up(MigrationBuilder migrationBuilder)\n    {\n        migrationBuilder.AddColumn&lt;int&gt;(\n            name: \"StockQuantity\",\n            table: \"Products\",\n            type: \"int\",\n            nullable: false,\n            defaultValue: 0);\n\n        migrationBuilder.CreateIndex(\n            name: \"IX_Products_StockQuantity\",\n            table: \"Products\",\n            column: \"StockQuantity\");\n    }\n\n    protected override void Down(MigrationBuilder migrationBuilder)\n    {\n        migrationBuilder.DropColumn(\n            name: \"StockQuantity\",\n            table: \"Products\");\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30af\u30a8\u30ea\u6700\u9069\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">\u52b9\u7387\u7684\u306a\u30af\u30a8\u30ea\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class OptimizedProductRepository : IProductRepository\n{\n    private readonly ApplicationDbContext _context;\n\n    \/\/ \u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\u4f8b\n    public async Task&lt;IEnumerable&lt;ProductSummary&gt;&gt; GetProductSummariesAsync()\n    {\n        return await _context.Products\n            .AsNoTracking()  \/\/ \u8aad\u307f\u53d6\u308a\u5c02\u7528\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\n            .Select(p =&gt; new ProductSummary  \/\/ \u5fc5\u8981\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u307f\u9078\u629e\n            {\n                Id = p.Id,\n                Name = p.Name,\n                Price = p.Price,\n                CategoryName = p.Category.Name\n            })\n            .ToListAsync();\n    }\n\n    \/\/ \u30da\u30fc\u30b8\u30f3\u30b0\u51e6\u7406\u306e\u5b9f\u88c5\n    public async Task&lt;(List&lt;Product&gt; Items, int TotalCount)&gt; GetPagedAsync(\n        int pageNumber, \n        int pageSize)\n    {\n        var query = _context.Products\n            .Include(p =&gt; p.Category)\n            .AsNoTracking();\n\n        var totalCount = await query.CountAsync();\n\n        var items = await query\n            .OrderBy(p =&gt; p.Name)\n            .Skip((pageNumber - 1) * pageSize)\n            .Take(pageSize)\n            .ToListAsync();\n\n        return (items, totalCount);\n    }\n\n    \/\/ \u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u306e\u5b9f\u88c5\n    public async Task&lt;IEnumerable&lt;Product&gt;&gt; SearchAsync(ProductSearchCriteria criteria)\n    {\n        var query = _context.Products.AsQueryable();\n\n        if (!string.IsNullOrEmpty(criteria.Name))\n            query = query.Where(p =&gt; p.Name.Contains(criteria.Name));\n\n        if (criteria.MinPrice.HasValue)\n            query = query.Where(p =&gt; p.Price &gt;= criteria.MinPrice.Value);\n\n        if (criteria.MaxPrice.HasValue)\n            query = query.Where(p =&gt; p.Price &lt;= criteria.MaxPrice.Value);\n\n        return await query\n            .AsNoTracking()\n            .ToListAsync();\n    }\n}<\/pre>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30af\u30a8\u30ea\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u306e\u307f\u306e\u53d6\u5f97<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">N+1\u554f\u984c\u306e\u56de\u907f<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30af\u30a8\u30ea\u306e\u7d50\u679c\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0<\/p>\n<\/div><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public async Task&lt;bool&gt; ProcessOrderAsync(Order order)\n{\n    using var transaction = await _context.Database.BeginTransactionAsync();\n    try\n    {\n        \/\/ \u6ce8\u6587\u306e\u767b\u9332\n        await _context.Orders.AddAsync(order);\n\n        \/\/ \u5728\u5eab\u306e\u66f4\u65b0\n        foreach (var item in order.Items)\n        {\n            var product = await _context.Products.FindAsync(item.ProductId);\n            product.StockQuantity -= item.Quantity;\n        }\n\n        await _context.SaveChangesAsync();\n        await transaction.CommitAsync();\n        return true;\n    }\n    catch\n    {\n        await transaction.RollbackAsync();\n        throw;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-52\">\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u3068CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u52b9\u7387\u7684\u306a\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u3068\u7d99\u7d9a\u7684\u306a\u958b\u767a\u30fb\u30c7\u30ea\u30d0\u30ea\u30fc\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-53\">Docker\u30b3\u30f3\u30c6\u30ca\u3092\u4f7f\u7528\u3057\u305f\u5c55\u958b\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">Dockerfile\u306e\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"dockerfile\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d3\u30eb\u30c9\u30b9\u30c6\u30fc\u30b8\nFROM mcr.microsoft.com\/dotnet\/sdk:7.0 AS build\nWORKDIR \/src\n\n# \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\u3068\u4f9d\u5b58\u95a2\u4fc2\u306e\u5fa9\u5143\nCOPY [\"MyApp.csproj\", \".\/\"]\nRUN dotnet restore\n\n# \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u30b3\u30d4\u30fc\u3068\u30d3\u30eb\u30c9\nCOPY . .\nRUN dotnet build -c Release -o \/app\/build\nRUN dotnet publish -c Release -o \/app\/publish\n\n# \u5b9f\u884c\u30b9\u30c6\u30fc\u30b8\nFROM mcr.microsoft.com\/dotnet\/aspnet:7.0\nWORKDIR \/app\nCOPY --from=build \/app\/publish .\nEXPOSE 80\nENTRYPOINT [\"dotnet\", \"MyApp.dll\"]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">docker-compose.yml\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  webapp:\n    build: \n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"8080:80\"\n    environment:\n      - ASPNETCORE_ENVIRONMENT=Production\n      - ConnectionStrings__DefaultConnection=Server=db;Database=MyApp;User=sa;Password=YourPassword;\n    depends_on:\n      - db\n\n  db:\n    image: mcr.microsoft.com\/mssql\/server:2019-latest\n    environment:\n      - ACCEPT_EULA=Y\n      - SA_PASSWORD=YourPassword\n    ports:\n      - \"1433:1433\"\n    volumes:\n      - dbdata:\/var\/opt\/mssql\n\nvolumes:\n  dbdata:<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-56\">\u30af\u30e9\u30a6\u30c9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u624b\u9806<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-57\">Azure App Service\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># azure-pipeline.yml\ntrigger:\n  - main\n\nvariables:\n  azureSubscription: 'Azure Production'\n  webAppName: 'myapp-production'\n  vmImageName: 'ubuntu-latest'\n\nstages:\n- stage: Build\n  displayName: Build stage\n  jobs:\n  - job: Build\n    displayName: Build\n    pool:\n      vmImage: $(vmImageName)\n    steps:\n    - task: DotNetCoreCLI@2\n      inputs:\n        command: 'build'\n        projects: '**\/*.csproj'\n        arguments: '--configuration Release'\n\n    - task: DotNetCoreCLI@2\n      inputs:\n        command: 'publish'\n        publishWebProjects: true\n        arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)'\n\n    - task: PublishBuildArtifacts@1\n      inputs:\n        pathtoPublish: '$(Build.ArtifactStagingDirectory)'\n        artifactName: 'webapp'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-58\">\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"Production\": {\n    \"ConnectionStrings\": {\n      \"DefaultConnection\": \"Server=prod-db;Database=MyApp;...\"\n    },\n    \"Logging\": {\n      \"LogLevel\": {\n        \"Default\": \"Information\",\n        \"Microsoft\": \"Warning\"\n      }\n    },\n    \"ApplicationInsights\": {\n      \"ConnectionString\": \"your-connection-string\"\n    }\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-59\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u7d99\u7d9a\u7684\u30c7\u30d7\u30ed\u30a4\u306e\u69cb\u7bc9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-60\">\u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ProductControllerTests\n{\n    private readonly IProductService _mockProductService;\n    private readonly ProductController _controller;\n\n    public ProductControllerTests()\n    {\n        _mockProductService = Substitute.For&lt;IProductService&gt;();\n        _controller = new ProductController(_mockProductService);\n    }\n\n    [Fact]\n    public async Task Index_ReturnsViewResult_WithListOfProducts()\n    {\n        \/\/ Arrange\n        var expectedProducts = new List&lt;Product&gt;\n        {\n            new Product { Id = 1, Name = \"Test Product\" }\n        };\n        _mockProductService.GetProductsAsync()\n            .Returns(expectedProducts);\n\n        \/\/ Act\n        var result = await _controller.Index();\n\n        \/\/ Assert\n        var viewResult = Assert.IsType&lt;ViewResult&gt;(result);\n        var model = Assert.IsAssignableFrom&lt;IEnumerable&lt;Product&gt;&gt;(\n            viewResult.Model);\n        Assert.Equal(expectedProducts.Count, model.Count());\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-61\">CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u69cb\u7bc9\uff08GitHub Actions\uff09<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">name: .NET Core CI\/CD\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions\/checkout@v2\n\n    - name: Setup .NET Core\n      uses: actions\/setup-dotnet@v1\n      with:\n        dotnet-version: '7.0.x'\n\n    - name: Restore dependencies\n      run: dotnet restore\n\n    - name: Build\n      run: dotnet build --configuration Release --no-restore\n\n    - name: Test\n      run: dotnet test --no-restore --verbosity normal\n\n    - name: Publish\n      run: dotnet publish -c Release -o publish\n\n    - name: Deploy to Azure Web Apps\n      uses: azure\/webapps-deploy@v2\n      with:\n        app-name: 'myapp-production'\n        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}\n        package: .\/publish<\/pre>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u74b0\u5883\u7ba1\u7406\u306b\u304a\u3051\u308b\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u7ba1\u7406<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u74b0\u5883\u5909\u6570\u306e\u6d3b\u7528<\/p>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-62\">\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-63\">Application Insights\u306e\u8a73\u7d30\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    \/\/ Application Insights\u306e\u9ad8\u5ea6\u306a\u8a2d\u5b9a\n    services.AddApplicationInsightsTelemetry(options =&gt;\n    {\n        options.EnableAdaptiveSampling = true;\n        options.EnableQuickPulseMetricStream = true;\n        options.EnableDebugLogger = false;\n        options.EnableHeartbeat = true;\n    });\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30c6\u30ec\u30e1\u30c8\u30ea\u306e\u8a2d\u5b9a\n    services.AddSingleton&lt;ITelemetryInitializer, CustomTelemetryInitializer&gt;();\n}\n\npublic class CustomTelemetryInitializer : ITelemetryInitializer\n{\n    public void Initialize(ITelemetry telemetry)\n    {\n        telemetry.Context.Cloud.RoleName = \"MyWebApp\";\n        telemetry.Context.Component.Version = \"1.0.0\";\n\n        if (telemetry is RequestTelemetry request)\n        {\n            request.Properties[\"CustomProperty\"] = \"CustomValue\";\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-64\">\u69cb\u9020\u5316\u30ed\u30b0\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LoggingMiddleware\n{\n    private readonly RequestDelegate _next;\n    private readonly ILogger&lt;LoggingMiddleware&gt; _logger;\n\n    public LoggingMiddleware(RequestDelegate next, ILogger&lt;LoggingMiddleware&gt; logger)\n    {\n        _next = next;\n        _logger = logger;\n    }\n\n    public async Task InvokeAsync(HttpContext context)\n    {\n        try\n        {\n            var startTime = DateTime.UtcNow;\n\n            \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u60c5\u5831\u306e\u30ed\u30b0\n            _logger.LogInformation(\n                \"Request {Method} {Path} started at {StartTime}\",\n                context.Request.Method,\n                context.Request.Path,\n                startTime);\n\n            await _next(context);\n\n            \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u60c5\u5831\u306e\u30ed\u30b0\n            var duration = DateTime.UtcNow - startTime;\n            _logger.LogInformation(\n                \"Request completed with status {StatusCode} in {Duration}ms\",\n                context.Response.StatusCode,\n                duration.TotalMilliseconds);\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(\n                ex,\n                \"Request failed with error: {ErrorMessage}\",\n                ex.Message);\n            throw;\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-65\">\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class MetricsService\n{\n    private readonly TelemetryClient _telemetryClient;\n    private readonly ILogger&lt;MetricsService&gt; _logger;\n\n    public MetricsService(TelemetryClient telemetryClient, ILogger&lt;MetricsService&gt; logger)\n    {\n        _telemetryClient = telemetryClient;\n        _logger = logger;\n    }\n\n    public void TrackDatabaseOperation(string operation, TimeSpan duration, bool success)\n    {\n        _telemetryClient.TrackMetric(new MetricTelemetry\n        {\n            Name = $\"Database.{operation}.Duration\",\n            Value = duration.TotalMilliseconds\n        });\n\n        _telemetryClient.TrackEvent($\"Database.{operation}\", \n            new Dictionary&lt;string, string&gt;\n            {\n                [\"Success\"] = success.ToString(),\n                [\"Duration\"] = duration.TotalMilliseconds.ToString()\n            });\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u306e\u5229\u70b9<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u7570\u5e38\u691c\u77e5\u306e\u81ea\u52d5\u5316<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u8a73\u7d30\u306a\u30ed\u30b0\u5206\u6790\u304c\u53ef\u80fd<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u306b\u3088\u308b\u696d\u52d9\u6307\u6a19\u306e\u8ffd\u8de1<\/p>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-66\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6226\u7565\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-67\">\u30d6\u30eb\u30fc\/\u30b0\u30ea\u30fc\u30f3\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u8a2d\u5b9a\uff08Azure Pipelines\uff09<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">stages:\n- stage: Deploy\n  jobs:\n  - deployment: Deploy\n    environment: production\n    strategy:\n      blueGreen:\n        # \u30d7\u30ec\u30d7\u30ed\u30c0\u30af\u30b7\u30e7\u30f3\u30b9\u30ed\u30c3\u30c8\u3078\u306e\u30c7\u30d7\u30ed\u30a4\n        - task: AzureWebApp@1\n          inputs:\n            azureSubscription: '$(azureSubscription)'\n            appName: '$(webAppName)'\n            slotName: 'staging'\n            package: '$(Pipeline.Workspace)\/drop\/**\/*.zip'\n\n        # \u30c6\u30b9\u30c8\u306e\u5b9f\u884c\n        - task: PowerShell@2\n          inputs:\n            targetType: 'inline'\n            script: |\n              $statusCode = (Invoke-WebRequest -Uri \"https:\/\/$(webAppName)-staging.azurewebsites.net\/health\").StatusCode\n              if ($statusCode -ne 200) { throw \"Health check failed\" }\n\n        # \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u5207\u308a\u66ff\u3048\n        - task: AzureAppServiceManage@0\n          inputs:\n            azureSubscription: '$(azureSubscription)'\n            action: 'Swap Slot'\n            webAppName: '$(webAppName)'\n            sourceSlot: 'staging'\n            targetSlot: 'production'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-68\">\u30ab\u30ca\u30ea\u30a2\u30ea\u30ea\u30fc\u30b9\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CanaryRoutingMiddleware\n{\n    private readonly RequestDelegate _next;\n    private const double CanaryPercentage = 0.1; \/\/ 10%\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\n\n    public async Task InvokeAsync(HttpContext context)\n    {\n        var random = new Random();\n        var isCanary = random.NextDouble() &lt; CanaryPercentage;\n\n        if (isCanary)\n        {\n            context.Request.Headers[\"X-Version\"] = \"canary\";\n            \/\/ \u30ab\u30ca\u30ea\u30a2\u30d0\u30fc\u30b8\u30e7\u30f3\u3078\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\n            await RouteToCanary(context);\n        }\n        else\n        {\n            await _next(context);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-69\">\u81ea\u52d5\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u76e3\u8996\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class HealthMonitorService : BackgroundService\n{\n    private readonly ILogger&lt;HealthMonitorService&gt; _logger;\n    private readonly IDeploymentService _deploymentService;\n    private int _failureCount = 0;\n    private const int FailureThreshold = 3;\n\n    protected override async Task ExecuteAsync(CancellationToken stoppingToken)\n    {\n        while (!stoppingToken.IsCancellationRequested)\n        {\n            var isHealthy = await CheckApplicationHealth();\n\n            if (!isHealthy)\n            {\n                _failureCount++;\n                _logger.LogWarning(\"Health check failed. Failure count: {Count}\", _failureCount);\n\n                if (_failureCount &gt;= FailureThreshold)\n                {\n                    _logger.LogError(\"Health check threshold exceeded. Initiating rollback...\");\n                    await _deploymentService.RollbackToLastKnownGoodVersion();\n                }\n            }\n            else\n            {\n                _failureCount = 0;\n            }\n\n            await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);\n        }\n    }\n\n    private async Task&lt;bool&gt; CheckApplicationHealth()\n    {\n        try\n        {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af\n            \/\/ - API \u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u5fdc\u7b54\u78ba\u8a8d\n            \/\/ - \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u306e\u78ba\u8a8d\n            \/\/ - \u91cd\u8981\u306a\u4f9d\u5b58\u30b5\u30fc\u30d3\u30b9\u306e\u72b6\u614b\u78ba\u8a8d\n            return true;\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, \"Health check failed\");\n            return false;\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6226\u7565\u306e\u5229\u70b9<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u7121\u505c\u6b62\u3067\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u5207\u308a\u66ff\u3048<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u6bb5\u968e\u7684\u306a\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u79fb\u884c<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u81ea\u52d5\u5316\u3055\u308c\u305f\u969c\u5bb3\u691c\u77e5\u3068\u5fa9\u65e7<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt wp-block-paragraph\">\u30ea\u30b9\u30af\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u305f\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u52b9\u7387\u7684\u3067\u5b89\u5168\u306a\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30d7\u30ed\u30bb\u30b9\u3092\u78ba\u7acb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-70\">\u6700\u5f8c\u306b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\u306f\u3001\u30e2\u30c0\u30f3\u306aWeb\u958b\u767a\u306b\u304a\u3051\u308b\u5f37\u529b\u306a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u3057\u3066\u3001\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u512a\u308c\u305f\u62e1\u5f35\u6027\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u57fa\u672c\u7684\u306a\u6982\u5ff5\u304b\u3089\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u624b\u6cd5\u307e\u3067\u3001\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5185\u5bb9\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5805\u7262\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u3068\u5b9f\u8df5\u3092\u901a\u3058\u3066\u3001ASP.NET Core\u306e\u771f\u4fa1\u3092\u767a\u63ee\u3055\u305b\u307e\u3057\u3087\u3046\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":2884,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,4],"tags":[],"class_list":["post-1249","post","type-post","status-publish","format-standard","has-post-thumbnail","category-csharp-aspnet","category-csharp"],"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1249"}],"version-history":[{"count":42,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1249\/revisions"}],"predecessor-version":[{"id":2901,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1249\/revisions\/2901"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/media\/2884"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}