[{"data":1,"prerenderedAt":812},["ShallowReactive",2],{"i-feather:search":3,"i-feather:x":8,"i-feather:moon":10,"i-feather:sun":12,"i-fa-brands:youtube":14,"i-fa-brands:twitch":18,"i-fa-brands:github":20,"i-fa-brands:linkedin":23,"i-fa-brands:stack-overflow":26,"i-simple-icons:bluesky":29,"i-fa-brands:mastodon":31,"i-fa-regular:envelope":33,"i-fa-solid:rss":35,"post-\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F":37,"post-navigation":420,"i-fa-solid:share-alt":792,"i-fa-brands:facebook":794,"i-fa-brands:twitter":796,"i-fa-brands:reddit":798,"i-fa-brands:patreon":800,"i-simple-icons:buymeacoffee":802,"i-fa-brands:paypal":804,"i-fa-regular:question-circle":806,"i-feather:arrow-left":808,"i-feather:arrow-right":810},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003Cpath d=\"m21 21l-4.35-4.35\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"5\"\u002F>\u003Cpath d=\"M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":15,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":17},576,512,"\u003Cpath fill=\"currentColor\" d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"currentColor\" d=\"M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0L24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75l-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z\"\u002F>",{"left":4,"top":4,"width":21,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":22},496,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":25},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":28},384,"\u003Cpath fill=\"currentColor\" d=\"M290.7 311L95 269.7L86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8l153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24l119.3 160.3l32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":30},"\u003Cpath fill=\"currentColor\" d=\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":32},"\u003Cpath fill=\"currentColor\" d=\"M433 179.11c0-97.2-63.71-125.7-63.71-125.7c-62.52-28.7-228.56-28.4-290.48 0c0 0-63.72 28.5-63.72 125.7c0 115.7-6.6 259.4 105.63 289.1c40.51 10.7 75.32 13 103.33 11.4c50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7c56.12-6.7 105-41.3 111.23-72.9c9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175c25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5l11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1c23.71 27.3 18.4 53 18.4 175z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":34},"\u003Cpath fill=\"currentColor\" d=\"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48m0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49c-16.841 13.247-50.201 45.072-73.413 44.701c-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646c21.857 17.205 60.134 55.186 103.062 54.955c42.717.231 80.509-37.199 103.053-54.947c49.528-38.783 82.032-64.401 104.947-82.653V400z\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":36},"\u003Cpath fill=\"currentColor\" d=\"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041s64.04 28.673 64.04 64.041m175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018c111.832 7.284 201.473 96.702 208.772 208.772c.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79m144.249.288C439.596 229.677 251.465 40.445 16.503 32.01C7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999c191.179 7.839 344.627 161.316 352.465 352.465c.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504\"\u002F>",{"id":38,"title":39,"author":40,"body":41,"comments":291,"date":399,"dateModified":400,"description":401,"extension":402,"headings":403,"heroImage":407,"meta":408,"path":409,"permalink":409,"published":410,"stem":411,"tags":412,"timeToRead":419},"posts\u002Fposts\u002F2015\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002Findex.md","Dynamically Generating Robots.txt Using ASP.NET MVC","Muhammad Rehan Saeed",{"type":42,"value":43,"toc":288},"minimark",[44,111,123,142,149,160,163,170,201,211,216,226,235,242,247,261,270,276,284],[45,46,47,55,81,99,105],"ul",{},[48,49,50],"li",{},[51,52,54],"a",{"href":53},"\u002Fasp-net-mvc-boilerplate\u002F","ASP.NET Core Boilerplate",[48,56,57,61],{},[58,59,60],"p",{},"Security",[45,62,63,69,75],{},[48,64,65],{},[51,66,68],{"href":67},"\u002Fsecuring-the-aspnet-mvc-web-config\u002F","Securing the ASP.NET MVC Web.config (Updated)",[48,70,71],{},[51,72,74],{"href":73},"\u002Fnwebsec-asp-net-mvc-security-through-http-headers\u002F","NWebSec ASP.NET MVC Security Through HTTP Headers",[48,76,77],{},[51,78,80],{"href":79},"\u002Fcontent-security-policy-for-asp-net-mvc\u002F","Content Security Policy (CSP) for ASP.NET MVC",[48,82,83,86],{},[58,84,85],{},"Search Engine Optimization (SEO)",[45,87,88,94],{},[48,89,90],{},[51,91,93],{"href":92},"\u002Fcanonical-urls-for-asp-net-mvc\u002F","Canonical URL's for ASP.NET MVC",[48,95,96],{},[51,97,39],{"href":98},"\u002Fdynamically-generating-robots-txt-using-asp-net-mvc",[48,100,101],{},[51,102,104],{"href":103},"\u002Finternet-favicon-madness\u002F","Internet Favicon Madness (Updated)",[48,106,107],{},[51,108,110],{"href":109},"\u002Fbuilding-rssatom-feeds-for-asp-net-mvc\u002F","Building RSS\u002FAtom Feeds for ASP.NET MVC",[58,112,113,114,118,119,122],{},"A ",[115,116,117],"code",{},"robots.txt"," file is a simple text file you can place at the root of your site at ",[115,120,121],{},"http:\u002F\u002Fexample.com\u002Frobots.txt"," to tell search engine robots (also known as web crawlers) how to index your site. The robots know to look for this file at the root of every site before they start indexing the site. If you do not have this file in your site, you will be getting a lot of 404 Not Found errors in your logs.",[58,124,125,126,128,129,138,139,141],{},"The ",[115,127,117],{}," uses the ",[51,130,137],{"href":131,"rel":132,"target":136},"http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRobots_exclusion_standard",[133,134,135],"nofollow","noopener","noreferrer","_blank","Robots Exclusion Standard"," which is a very simple format that can give robots instructions on what to index and what to skip. A very basic ",[115,140,117],{}," file looks like this:",[143,144],"pre",{"className":145,"language":147,"html":148},[146],"language-text","text","# Allow all robots to index this site.\nuser-agent: *\n\n# Tell all robots not to index any of the pages under the \u002Ferror path.\ndisallow: \u002Ferror\u002F\n\n# Tell all robots to index the under the error\u002Ffoo path.\nallow: \u002Ferror\u002Ffoo\u002F\n\n# Add a link to the site-map. Unfortunately this must be an absolute URL.\nsitemap: http:\u002F\u002Fexample.com\u002Fsitemap.xml\n",[58,150,151,152,155,156,159],{},"In the above code, all comments start with the hash character. It tells all robots that they can index everything on the site except pages under the ",[115,153,154],{},"\u002Ferror"," path because we don't want our error pages showing up in peoples search results. The only exception to that rule is to allow the resources under the ",[115,157,158],{},"\u002Ferror\u002Ffoo"," path to be indexed.",[58,161,162],{},"The last line is interesting and tells robots where to find an XML file called a site-map. A site-map contains a list of URL's to all the pages in the site and is used to give search engines a list of URL's they can go through to index the entire site. It's a great SEO (Search Engine Optimization) technique to give your site a boost in it's search rankings.",[58,164,165,166,169],{},"I will discuss creating a dynamic ",[115,167,168],{},"sitemap.xml"," file for ASP.NET Core in a future post. For now, all you need to know is that the site-map URL has to be an absolute URL according to the specification. This is a pretty terrible decision by whoever created the robots exclusion standard. It's really annoying that when you're creating a site, you have to remember to manually update this URL. If the URL was relative we would not have this problem.",[171,172,175,181],"h1",{"id":173,"data-section-heading":174},"dynamically-generating-a-robotstxt-file","",[176,177,180],"span",{"className":178},[179],"heading__text","Dynamically Generating a robots.txt File",[182,183,186],"anchor-link",{"href":184,"label":185},"#dynamically-generating-a-robotstxt-file","Link to this section",[187,188,195],"svg",{"xmlns":189,"xmlns:xlink":190,"viewBox":191,"version":192,"width":193,"height":193,"aria-hidden":194},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,"true",[196,197],"path",{"fill":198,"fill-rule":199,"d":200},"currentColor","evenodd","M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z",[58,202,203,204,206,207,210],{},"Fortunately, it's really easy to dynamically create a ",[115,205,117],{}," file, which auto-generates the site-map URL using the MVC ",[115,208,209],{},"UrlHelper",". Take a look at the code below:",[143,212],{"className":213,"language":214,"meta":174,"style":174,"html":215},"language-cs shiki shiki-themes light-plus monokai","cs","\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> HomeController\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Controller\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    [\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Route\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"robots.txt\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Name\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> \"GetRobotsText\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sw29p\">OutputCache\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Duration\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 86400\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ContentResult\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> RobotsText\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">        StringBuilder\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> stringBuilder\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> StringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AppendLine\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"user-agent: *\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AppendLine\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"disallow: \u002Ferror\u002F\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AppendLine\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"allow: \u002Ferror\u002Ffoo\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Append\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"sitemap: \"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AppendLine\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Url\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">RouteUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"GetSitemapXml\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Request\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Url\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Scheme\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">).\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">TrimEnd\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">'\u002F'\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        return\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Content\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">stringBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToString\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(), \u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"text\u002Fplain\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Encoding\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">UTF8\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    [\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Route\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"sitemap.xml\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Name\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> \"GetSitemapXml\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sw29p\">OutputCache\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Duration\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 86400\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ContentResult\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> SitemapXml\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F I'll talk about this in a later blog post.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[58,217,218,219,221,222,225],{},"I set up a route to the ",[115,220,117],{}," path at the root of the site in my main ",[115,223,224],{},"HomeController"," and cached the response for a day for better performance (You can and should probably specify a much longer period of time if you know yours won't change).",[58,227,228,229,231,232,234],{},"I then go on to append my commands to the StringBuilder. The great thing is that I can easily use the ",[115,230,209],{}," to generate a complete absolute URL to the ",[115,233,168],{}," path which is also dynamically generated in much the same way. Finally, I just return the string as plain text using the UTF-8 encoding.",[58,236,237,238,241],{},"Creating a route ending with a file extension is not allowed by default in ASP.NET Core. To get around this security restriction, you need to add the following to the ",[115,239,240],{},"Web.config"," file:",[143,243],{"className":244,"language":245,"meta":174,"style":174,"html":246},"language-xml shiki shiki-themes light-plus monokai","xml","\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;?\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">xml\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> version\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"1.0\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> encoding\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"utf-8\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\">?&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">configuration\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">  &lt;!-- ...Omitted --&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">  &lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">system.webServer\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    &lt;!-- ...Omitted --&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">    &lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">handlers\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">      &lt;!-- ...Omitted --&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">      &lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">add\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"RobotsText\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">           path\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"robots.txt\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">           verb\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"GET\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">           type\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"System.Web.Handlers.TransferRequestHandler\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">           preCondition\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"integratedMode,runtimeVersionv4.0\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">    &lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">handlers\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">  &lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">system.webServer\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">configuration\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[171,248,250,254],{"id":249,"data-section-heading":174},"conclusion",[176,251,253],{"className":252},[179],"Conclusion",[182,255,257],{"href":256,"label":185},"#conclusion",[187,258,259],{"xmlns":189,"xmlns:xlink":190,"viewBox":191,"version":192,"width":193,"height":193,"aria-hidden":194},[196,260],{"fill":198,"fill-rule":199,"d":200},[58,262,263,264,266,267,269],{},"Dynamically generating your ",[115,265,117],{}," file is pretty easy and only takes as many lines of code as you need to write your ",[115,268,117],{}," file anyway. It also means that you don't need to pollute your project structure with yet another file at the root of it (This problem is fixed in MVC Core, where all static files must be added to the wwwroot folder). You can also dynamically generate your site-map URL so you don't need to remember to update it every time you change the domain.",[58,271,272,273,275],{},"You could argue that performance is an issue when compared to a static ",[115,274,117],{}," text file but its a matter of a few bytes and if you cache the response with a sufficient time limit then I think that even that problem goes away.",[58,277,278,279,283],{},"Once again, you can find a working example of this and much more using the ",[51,280,54],{"href":281,"rel":282,"target":136},"https:\u002F\u002Fvisualstudiogallery.msdn.microsoft.com\u002F6cf50a48-fc1e-4eaf-9e82-0b2a6705ca7d",[133,134,135]," project template.",[285,286,287],"style",{},"html pre.shiki code .sJvqV, html code.shiki .sJvqV{--shiki-default:#0000FF;--shiki-dark:#F92672}html pre.shiki code .s4J9F, html code.shiki .s4J9F{--shiki-default:#0000FF;--shiki-default-font-style:inherit;--shiki-dark:#66D9EF;--shiki-dark-font-style:italic}html pre.shiki code .sw29p, html code.shiki .sw29p{--shiki-default:#267F99;--shiki-default-text-decoration:inherit;--shiki-dark:#A6E22E;--shiki-dark-text-decoration:underline}html pre.shiki code .sjLUg, html code.shiki .sjLUg{--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .swiDo, html code.shiki .swiDo{--shiki-default:#A31515;--shiki-dark:#E6DB74}html pre.shiki code .sFrd5, html code.shiki .sFrd5{--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .snCLD, html code.shiki .snCLD{--shiki-default:#000000;--shiki-dark:#F92672}html pre.shiki code .s0PsH, html code.shiki .s0PsH{--shiki-default:#098658;--shiki-dark:#AE81FF}html pre.shiki code .sWm5y, html code.shiki .sWm5y{--shiki-default:#795E26;--shiki-dark:#A6E22E}html pre.shiki code .sK46n, html code.shiki .sK46n{--shiki-default:#0000FF;--shiki-dark:#FD971F}html pre.shiki code .sMc8R, html code.shiki .sMc8R{--shiki-default:#0000FF;--shiki-dark:#AE81FF}html pre.shiki code .smL5M, html code.shiki .smL5M{--shiki-default:#AF00DB;--shiki-dark:#F92672}html pre.shiki code .s1q82, html code.shiki .s1q82{--shiki-default:#008000;--shiki-dark:#88846F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sNflI, html code.shiki .sNflI{--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .sjbfc, html code.shiki .sjbfc{--shiki-default:#800000;--shiki-dark:#F92672}html pre.shiki code .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}html pre.shiki code .squEy, html code.shiki .squEy{--shiki-default:#0000FF;--shiki-dark:#E6DB74}",{"title":174,"searchDepth":289,"depth":289,"links":290},2,[],{"issue":292,"comments":296},{"number":293,"title":294,"html_url":295},74,"[Comment] Dynamically Generating Robots.txt Using ASP.NET MVC","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74",[297,309,317,326,335,343,351,359,367,375,383,391],{"id":298,"html_url":299,"body_html":300,"created_at":301,"updated_at":301,"author_association":302,"user":303,"reactions":307},627254197,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254197","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Faa5a45de3b168d441cf410640666457cd56f6df1fe7f57f5ff20d03884851981\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38383666323465386334636137336332323031653033633031633236613466633f733d393626643d6d6d26723d67\">\u003Cimg alt=\"vlince\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Faa5a45de3b168d441cf410640666457cd56f6df1fe7f57f5ff20d03884851981\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38383666323465386334636137336332323031653033633031633236613466633f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>vlince\u003C\u002Fstrong> commented on \u003Cstrong>2015-08-22 07:48:34\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Out of curiosity, what is the added benefit of dynamically creating a \u003Ccode>robots.txt\u003C\u002Fcode> file versus creating a static one in terms of maintenance?\u003C\u002Fp>\n\u003Cp>I guess my real concern, is having to choose between polluting my project structure with another file versus having to redeploy the application each time I need to add, edit or delete stuff inside the \u003Ccode>robots.txt\u003C\u002Fcode>.\u003Cbr \u002F>\nWhat's the lesser of two evils?\u003C\u002Fp>","2020-05-12T10:25:18Z","OWNER",{"login":304,"avatar_url":305,"html_url":306},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":308,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254197\u002Freactions",{"id":310,"html_url":311,"body_html":312,"created_at":313,"updated_at":313,"author_association":302,"user":314,"reactions":315},627254253,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254253","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2015-08-22 08:02:08\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Out of curiosity, what is the added benefit of dynamically creating a robots.txt file versus creating a static one in terms of maintenance?\u003C\u002Fp>\n\u003Cp>I guess my real concern, is having to choose between polluting my project structure with another file versus having to redeploy the application each time I need to add, edit or delete stuff inside the robots.txt.\u003Cbr \u002F>\nWhat's the lesser of two evils?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Polluting your project structure is a real problem with MVC 5 e.g. if you want to support favicons on all the major platforms then you need to add lots of images to the root or add some meta tags. Thankfully, this problem is solved in MVC 5 with the separate \u003Ccode>wwwroot\u003C\u002Fcode> folder.\u003C\u002Fp>\n\u003Cp>Another problem is that the site-map URL has to be absolute. You have to manually go in and edit this URL. There are just so many little things like this you have to do to get a site up quickly, that I thought it would be best if I made the computer do the work instead. You have to remember your average developer using the ASP.NET Core Boilerplate project template is not always a web expert.\u003C\u002Fp>\n\u003Cp>I don't see \u003Ccode>robots.txt\u003C\u002Fcode> as a file you need to edit very often but you are right, you can no longer just edit the file and it means a deployment. Some developers may be less comfortable with this than others.\u003C\u002Fp>","2020-05-12T10:25:24Z",{"login":304,"avatar_url":305,"html_url":306},{"url":316,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254253\u002Freactions",{"id":318,"html_url":319,"body_html":320,"created_at":321,"updated_at":322,"author_association":302,"user":323,"reactions":324},627254317,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254317","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3e9712ce459f9d53ad60cd529f9b4102568a10bcc92e1ab78ba5b4876ebf23e6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61613637386363366334356265636232323064623932626462313337306430363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Fabricio\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3e9712ce459f9d53ad60cd529f9b4102568a10bcc92e1ab78ba5b4876ebf23e6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61613637386363366334356265636232323064623932626462313337306430363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Fabricio\u003C\u002Fstrong> commented on \u003Cstrong>2015-09-10 04:18:39\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>So, how about \u003Ccode>SitemapXml\u003C\u002Fcode>? it says \"I'll talk about this in a later blog post\", so...?\u003C\u002Fp>","2020-05-12T10:25:32Z","2020-05-12T12:00:06Z",{"login":304,"avatar_url":305,"html_url":306},{"url":325,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254317\u002Freactions",{"id":327,"html_url":328,"body_html":329,"created_at":330,"updated_at":331,"author_association":302,"user":332,"reactions":333},627254379,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254379","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2015-09-10 20:55:24\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>So, how about \u003Ccode>SitemapXml\u003C\u002Fcode>? it says \"I'll talk about this in a later blog post\", so...?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I've been massively busy lately with a career move. I'll get on it as soon as I can :)\u003C\u002Fp>","2020-05-12T10:25:38Z","2020-05-12T12:00:13Z",{"login":304,"avatar_url":305,"html_url":306},{"url":334,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254379\u002Freactions",{"id":336,"html_url":337,"body_html":338,"created_at":339,"updated_at":339,"author_association":302,"user":340,"reactions":341},627254449,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254449","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fce25d6b15a31c55e13154efccfae8cc00b6c476e38e68e06a09227318703e5b3\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34383330353464346266636365356266633437336136663366373733636634313f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Asad Ali\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fce25d6b15a31c55e13154efccfae8cc00b6c476e38e68e06a09227318703e5b3\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34383330353464346266636365356266633437336136663366373733636634313f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.hoxat.com\u002F\">Asad Ali\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-28 04:08:55\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>I have used your sitemap generating algorithms and robotsTXT\u003Cbr \u002F>\nthey work both fine at \u003Ccode>localhost:3333\u002Fsitemap.xml\u003C\u002Fcode> and \u003Ccode>\u002Frobots.txt\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>but after publishing and uploading at hosting service - i have to access those at \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.hoxat.com\u002Fsitemap.xml\u002F\">www.hoxat.com\u002Fsitemap.xml\u002F\u003C\u002Fa>\u003Cbr \u002F>\nif i don't add the slash then i get HTML 404\u003C\u002Fp>\n\u003Cp>i am using shared hosting\u003Cbr \u002F>\nWaiting for your kind reply\u003C\u002Fp>","2020-05-12T10:25:46Z",{"login":304,"avatar_url":305,"html_url":306},{"url":342,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254449\u002Freactions",{"id":344,"html_url":345,"body_html":346,"created_at":347,"updated_at":347,"author_association":302,"user":348,"reactions":349},627254512,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254512","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-28 13:57:56\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I have used your sitemap generating algorithms and robotsTXT\u003Cbr \u002F>\nthey work both fine at \u003Ccode>localhost:3333\u002Fsitemap.xml\u003C\u002Fcode> and \u003Ccode>\u002Frobots.txt\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>but after publishing and uploading at hosting service - i have to access those at \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.hoxat.com\u002Fsitemap.xml\u002F\">www.hoxat.com\u002Fsitemap.xml\u002F\u003C\u002Fa>\u003Cbr \u002F>\nif i don't add the slash then i get HTML 404\u003C\u002Fp>\n\u003Cp>i am using shared hosting\u003Cbr \u002F>\nWaiting for your kind reply\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Please raise an issue on the GitHub site listing the version of MVC you are using. The \u003Ccode>RedirectToCanonicalUrlAttribute\u003C\u002Fcode> is doing the redirecting. As long as you have the NoTrailingSlashAttribute on these actions it should be ok.\u003C\u002Fp>","2020-05-12T10:25:53Z",{"login":304,"avatar_url":305,"html_url":306},{"url":350,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254512\u002Freactions",{"id":352,"html_url":353,"body_html":354,"created_at":355,"updated_at":355,"author_association":302,"user":356,"reactions":357},627254572,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254572","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fbe89699f5df63d72dbf3aab670b178b41264819b8f8384a02b64a70ec7a64bf4\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63646235373435323066356263653832366436623765396435666134393162623f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Arlan Galvez\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fbe89699f5df63d72dbf3aab670b178b41264819b8f8384a02b64a70ec7a64bf4\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63646235373435323066356263653832366436623765396435666134393162623f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Arlan Galvez\u003C\u002Fstrong> commented on \u003Cstrong>2016-06-30 20:39:29\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi, I made all you said to make it work , but I had to put a route config rule because always the response was 404.\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>routes\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>MapRoute\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n    \u003Cspan>\"Robots.txt\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \n    \u003Cspan>\"robots.txt\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>new\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>controller\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"Home\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>action\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"RobotsText\"\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>new\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>\"VisaCuba.Controllers\"\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>It is mandatory to get the correct response? I'm using MVC 5.\u003Cbr \u002F>\nGreetings.\u003C\u002Fp>","2020-05-12T10:26:00Z",{"login":304,"avatar_url":305,"html_url":306},{"url":358,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254572\u002Freactions",{"id":360,"html_url":361,"body_html":362,"created_at":363,"updated_at":363,"author_association":302,"user":364,"reactions":365},627254642,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254642","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-07-02 11:09:46\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi, I made all you said to make it work , but I had to put a route config rule because always the response was 404.\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>routes\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>MapRoute\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n    \u003Cspan>\"Robots.txt\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \n    \u003Cspan>\"robots.txt\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>new\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>controller\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"Home\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>action\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"RobotsText\"\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>new\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>\"VisaCuba.Controllers\"\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>It is mandatory to get the correct response? I'm using MVC 5.\u003Cbr \u002F>\nGreetings.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Looks like you are not using attribute routing, which is why you needed to add that code.\u003C\u002Fp>","2020-05-12T10:26:08Z",{"login":304,"avatar_url":305,"html_url":306},{"url":366,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254642\u002Freactions",{"id":368,"html_url":369,"body_html":370,"created_at":371,"updated_at":371,"author_association":302,"user":372,"reactions":373},627254706,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254706","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3e9712ce459f9d53ad60cd529f9b4102568a10bcc92e1ab78ba5b4876ebf23e6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61613637386363366334356265636232323064623932626462313337306430363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Fabricio Gabrielli da Silva\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3e9712ce459f9d53ad60cd529f9b4102568a10bcc92e1ab78ba5b4876ebf23e6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61613637386363366334356265636232323064623932626462313337306430363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Fabricio Gabrielli da Silva\u003C\u002Fstrong> commented on \u003Cstrong>2016-07-04 12:35:28\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I've been massively busy lately with a career move. I'll get on it as soon as I can :)\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Any update on this?\u003C\u002Fp>","2020-05-12T10:26:15Z",{"login":304,"avatar_url":305,"html_url":306},{"url":374,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254706\u002Freactions",{"id":376,"html_url":377,"body_html":378,"created_at":379,"updated_at":379,"author_association":302,"user":380,"reactions":381},627254775,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254775","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-07-04 17:28:09\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Any update on this?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>This was posted some time ago.\u003Cbr \u002F>\n\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F\">https:\u002F\u002Frehansaeed.com\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F\u003C\u002Fa>\u003C\u002Fp>","2020-05-12T10:26:22Z",{"login":304,"avatar_url":305,"html_url":306},{"url":382,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254775\u002Freactions",{"id":384,"html_url":385,"body_html":386,"created_at":387,"updated_at":387,"author_association":302,"user":388,"reactions":389},627254842,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254842","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcf8d1b07de88b7c791d0cecee177faef31f4b0a78832da6993d7eeb4338934d8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65313063313734346530636264366166663466356231643065303337636534653f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ian Buchan\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcf8d1b07de88b7c791d0cecee177faef31f4b0a78832da6993d7eeb4338934d8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65313063313734346530636264366166663466356231643065303337636534653f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ian Buchan\u003C\u002Fstrong> commented on \u003Cstrong>2017-04-05 20:19:59\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Super slick trick.  I'm working with AWS API Gateway with a .NET Kestrel server living in a Lambda function that's invoked via the incoming web requests.  Every day or so, I would end up with a 404 for my robots.txt file.  Since it was only an API, I had no file server to return the robots.txt from.  Dynamically generating it solved the problem perfectly!\u003C\u002Fp>","2020-05-12T10:26:28Z",{"login":304,"avatar_url":305,"html_url":306},{"url":390,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254842\u002Freactions",{"id":392,"html_url":393,"body_html":394,"created_at":395,"updated_at":395,"author_association":302,"user":396,"reactions":397},627254899,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F74#issuecomment-627254899","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fd281430d3a1eeeddb4945b84bf105e987cf5082244a4c6556693cb8e81480033\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f35343034623638313736336136663562373031323538366531366565326561643f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Wagner Melo\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fd281430d3a1eeeddb4945b84bf105e987cf5082244a4c6556693cb8e81480033\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f35343034623638313736336136663562373031323538366531366565326561643f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Wagner Melo\u003C\u002Fstrong> commented on \u003Cstrong>2020-05-10 00:51:14\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Don't forget to turn on attribute based routing in ASP.NET MVC 5 when you register your routes in \u003Ccode>RouteConfig\u003C\u002Fcode>.\u003Cbr \u002F>\nIt's a simple line statement.\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>RegisterRoutes\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>RouteCollection\u003C\u002Fspan> \u003Cspan>routes\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>routes\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IgnoreRoute\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"{resource}.axd\u002F{*pathInfo}\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>routes\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>MapMvcAttributeRoutes\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>\u002F\u002F ...\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:26:35Z",{"login":304,"avatar_url":305,"html_url":306},{"url":398,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627254899\u002Freactions","2015-07-31T00:00:00+00:00",null,"How to dynamically generate a robots.txt file using a simple ASP.NET MVC action method and only a few lines of code.","md",[404,406],{"depth":405,"value":180},1,{"depth":405,"value":253},"\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{},"\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F",true,"posts\u002F2015\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002Findex",[413,414,54,415,416,85,417,418],".NET","ASP.NET MVC","C#","Robots","Search Engines","Web Crawlers",4,[421,425,429,434,438,441,444,448,452,456,459,463,468,471,474,478,482,486,489,493,497,501,504,507,510,514,517,519,522,525,527,530,533,535,536,540,543,547,551,555,559,563,567,571,574,578,582,586,590,593,597,601,604,607,611,615,620,624,628,632,636,640,644,647,650,653,657,661,664,668,671,674,677,680,684,688,691,694,698,702,705,708,711,715,719,723,727,730,733,738,741,744,748,751,755,759,762,766,769,772,776,780,784,788],{"title":422,"permalink":423,"heroImage":424,"timeToRead":405},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":426,"permalink":427,"heroImage":428,"timeToRead":289},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":430,"permalink":431,"heroImage":432,"timeToRead":433},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",3,{"title":435,"permalink":436,"heroImage":437,"timeToRead":419},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Freactive-extensions-part1-replacing-events\u002F","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",{"title":439,"permalink":440,"heroImage":437,"timeToRead":433},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":442,"permalink":443,"heroImage":437,"timeToRead":289},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":445,"permalink":446,"heroImage":447,"timeToRead":433},"WPF Metro Part 1 - Modern UI for WPF","\u002Fwpf-metro-part1-modern-ui-for-wpf\u002F","\u002Fimages\u002Fhero\u002FModern-UI-for-WPF-1366x768.png",{"title":449,"permalink":450,"heroImage":451,"timeToRead":433},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":453,"permalink":454,"heroImage":455,"timeToRead":433},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":457,"permalink":458,"heroImage":437,"timeToRead":433},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":460,"permalink":461,"heroImage":462,"timeToRead":289},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":464,"permalink":465,"heroImage":466,"timeToRead":467},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":469,"permalink":470,"heroImage":437,"timeToRead":419},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":472,"permalink":473,"heroImage":428,"timeToRead":467},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":475,"permalink":476,"heroImage":437,"timeToRead":477},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":479,"permalink":480,"heroImage":481,"timeToRead":405},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":483,"permalink":484,"heroImage":485,"timeToRead":477},"Model-View-ViewModel (MVVM) - Part 1 - Overview","\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{"title":487,"permalink":488,"heroImage":485,"timeToRead":419},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable","\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F",{"title":490,"permalink":491,"heroImage":485,"timeToRead":492},"Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F",11,{"title":494,"permalink":495,"heroImage":496,"timeToRead":433},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":498,"permalink":499,"heroImage":485,"timeToRead":500},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F",12,{"title":502,"permalink":503,"heroImage":466,"timeToRead":419},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":54,"permalink":53,"heroImage":505,"timeToRead":506},"\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":104,"permalink":103,"heroImage":508,"timeToRead":509},"\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":511,"permalink":512,"heroImage":513,"timeToRead":506},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":515,"permalink":516,"heroImage":513,"timeToRead":433},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":518,"permalink":67,"heroImage":505,"timeToRead":492},"Securing the ASP.NET MVC Web.config",{"title":520,"permalink":521,"heroImage":437,"timeToRead":289},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":74,"permalink":73,"heroImage":523,"timeToRead":524},"\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",6,{"title":80,"permalink":79,"heroImage":526,"timeToRead":193},"\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":528,"permalink":529,"heroImage":428,"timeToRead":477},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":110,"permalink":109,"heroImage":531,"timeToRead":532},"\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":93,"permalink":92,"heroImage":534,"timeToRead":492},"\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{"title":39,"permalink":409,"heroImage":407,"timeToRead":419},{"title":537,"permalink":538,"heroImage":539,"timeToRead":419},"Minifying HTML for ASP.NET MVC","\u002Fminifying-html-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FThe-Internet-Is-A-Series-Of-Tubes-1366x768.jpg",{"title":541,"permalink":542,"heroImage":505,"timeToRead":289},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":544,"permalink":545,"heroImage":546,"timeToRead":506},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":548,"permalink":549,"heroImage":550,"timeToRead":289},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":552,"permalink":553,"heroImage":554,"timeToRead":405},".NET Big-O Algorithm Complexity Cheat Sheet","\u002Fnet-big-o-algorithm-complexity-cheat-sheet\u002F","\u002Fimages\u002Fhero\u002FNET-Big-O-Algorithm-Complexity-Cheat-Sheet-1366x768.jpg",{"title":556,"permalink":557,"heroImage":558,"timeToRead":433},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":560,"permalink":561,"heroImage":562,"timeToRead":405},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":564,"permalink":565,"heroImage":566,"timeToRead":289},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":568,"permalink":569,"heroImage":570,"timeToRead":433},"Subresource Integrity TagHelper Using ASP.NET Core - Part 1","\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FMake-Security-Easy-1366x768.png",{"title":572,"permalink":573,"heroImage":570,"timeToRead":419},"Subresource Integrity TagHelper Using ASP.NET Core - Part 2","\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F",{"title":575,"permalink":576,"heroImage":577,"timeToRead":477},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":579,"permalink":580,"heroImage":581,"timeToRead":524},"Azure Active Directory Versus Identity Server","\u002Fazure-active-directory-versus-identity-server\u002F","\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{"title":583,"permalink":584,"heroImage":585,"timeToRead":289},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":587,"permalink":588,"heroImage":589,"timeToRead":492},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":591,"permalink":592,"heroImage":428,"timeToRead":289},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":594,"permalink":595,"heroImage":596,"timeToRead":419},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":598,"permalink":599,"heroImage":600,"timeToRead":506},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":602,"permalink":603,"heroImage":437,"timeToRead":405},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":605,"permalink":606,"heroImage":428,"timeToRead":419},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":608,"permalink":609,"heroImage":610,"timeToRead":467},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":612,"permalink":613,"heroImage":614,"timeToRead":506},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":616,"permalink":617,"heroImage":618,"timeToRead":619},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":621,"permalink":622,"heroImage":623,"timeToRead":419},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":625,"permalink":626,"heroImage":627,"timeToRead":289},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":629,"permalink":630,"heroImage":631,"timeToRead":524},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":633,"permalink":634,"heroImage":635,"timeToRead":289},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":637,"permalink":638,"heroImage":639,"timeToRead":477},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":641,"permalink":642,"heroImage":643,"timeToRead":405},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":645,"permalink":646,"heroImage":643,"timeToRead":433},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":648,"permalink":649,"heroImage":643,"timeToRead":419},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":651,"permalink":652,"heroImage":643,"timeToRead":477},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":654,"permalink":655,"heroImage":656,"timeToRead":419},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":658,"permalink":659,"heroImage":660,"timeToRead":477},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":662,"permalink":663,"heroImage":428,"timeToRead":289},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":665,"permalink":666,"heroImage":667,"timeToRead":289},".NET Boxed","\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":669,"permalink":670,"heroImage":428,"timeToRead":289},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":672,"permalink":673,"heroImage":428,"timeToRead":433},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":675,"permalink":676,"heroImage":428,"timeToRead":405},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":678,"permalink":679,"heroImage":428,"timeToRead":619},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":681,"permalink":682,"heroImage":683,"timeToRead":506},"PluralSight vs LinkedIn Learning vs FrontendMasters vs Egghead.io vs YouTube","\u002Fpluralsight-vs-linkedin-learning-vs-frontendmasters-vs-egghead-io-vs-youtube\u002F","\u002Fimages\u002Fhero\u002FOnline-Learning-1366x768.png",{"title":685,"permalink":686,"heroImage":687,"timeToRead":619},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":689,"permalink":690,"heroImage":667,"timeToRead":619},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":692,"permalink":693,"heroImage":643,"timeToRead":405},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":695,"permalink":696,"heroImage":697,"timeToRead":419},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":699,"permalink":700,"heroImage":701,"timeToRead":506},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":703,"permalink":704,"heroImage":428,"timeToRead":433},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":706,"permalink":707,"heroImage":667,"timeToRead":477},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":709,"permalink":710,"heroImage":428,"timeToRead":419},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":712,"permalink":713,"heroImage":714,"timeToRead":506},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":716,"permalink":717,"heroImage":718,"timeToRead":289},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":720,"permalink":721,"heroImage":722,"timeToRead":477},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":724,"permalink":725,"heroImage":726,"timeToRead":477},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":728,"permalink":729,"heroImage":481,"timeToRead":524},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":731,"permalink":732,"heroImage":428,"timeToRead":433},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":734,"permalink":735,"heroImage":736,"timeToRead":737},"Deep Dive into Open Telemetry for .NET","\u002Fdeep-dive-into-open-telemetry-for-net\u002F","\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",10,{"title":739,"permalink":740,"heroImage":736,"timeToRead":433},"Open Telemetry for ASP.NET Core","\u002Fopen-telemetry-for-asp-net-core\u002F",{"title":742,"permalink":743,"heroImage":736,"timeToRead":433},"Exporting Open Telemetry Data to Jaeger","\u002Fexporting-open-telemetry-data-to-jaeger\u002F",{"title":745,"permalink":746,"heroImage":747,"timeToRead":433},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":749,"permalink":750,"heroImage":747,"timeToRead":524},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":752,"permalink":753,"heroImage":754,"timeToRead":419},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":756,"permalink":757,"heroImage":758,"timeToRead":289},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":760,"permalink":761,"heroImage":513,"timeToRead":405},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":763,"permalink":764,"heroImage":765,"timeToRead":433},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":767,"permalink":768,"heroImage":428,"timeToRead":433},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":770,"permalink":771,"heroImage":736,"timeToRead":419},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core","\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F",{"title":773,"permalink":774,"heroImage":775,"timeToRead":289},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":777,"permalink":778,"heroImage":779,"timeToRead":289},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":781,"permalink":782,"heroImage":783,"timeToRead":419},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"title":785,"permalink":786,"heroImage":787,"timeToRead":405},"AI Gone Rogue","\u002Fai-gone-rogue\u002F","\u002Fimages\u002Fhero\u002FHAL-9000-Prop-1600x900.png",{"title":789,"permalink":790,"heroImage":791,"timeToRead":477},"AI Learnings from Upgrading My Blog","\u002Fai-learnings-from-upgrading-my-blog\u002F","\u002Fimages\u002Fhero\u002FAI-Agents-Upgrading-a-Blog-With-Human-Code-Review-1600x900.png",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":793},"\u003Cpath fill=\"currentColor\" d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.55 96.55 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.3 96.3 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96s-42.981-96-96-96\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":795},"\u003Cpath fill=\"currentColor\" d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48c27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":797},"\u003Cpath fill=\"currentColor\" d=\"M459.37 151.716c.325 4.548.325 9.097.325 13.645c0 138.72-105.583 298.558-298.558 298.558c-59.452 0-114.68-17.219-161.137-47.106c8.447.974 16.568 1.299 25.34 1.299c49.055 0 94.213-16.568 130.274-44.832c-46.132-.975-84.792-31.188-98.112-72.772c6.498.974 12.995 1.624 19.818 1.624c9.421 0 18.843-1.3 27.614-3.573c-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319c-28.264-18.843-46.781-51.005-46.781-87.391c0-19.492 5.197-37.36 14.294-52.954c51.655 63.675 129.3 105.258 216.365 109.807c-1.624-7.797-2.599-15.918-2.599-24.04c0-57.828 46.782-104.934 104.934-104.934c30.213 0 57.502 12.67 76.67 33.137c23.715-4.548 46.456-13.32 66.599-25.34c-7.798 24.366-24.366 44.833-46.132 57.827c21.117-2.273 41.584-8.122 60.426-16.243c-14.292 20.791-32.161 39.308-52.628 54.253\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":799},"\u003Cpath fill=\"currentColor\" d=\"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6c0-13.8 11.1-24.9 24.9-24.9c13.6 0 24.6 11.1 24.6 24.9c0 13.6-11.1 24.6-24.6 24.6M504 256c0 137-111 248-248 248S8 393 8 256S119 8 256 8s248 111 248 248m-132.3-41.2c-9.4 0-17.7 3.9-23.8 10c-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3l55.4 12.5c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8c-6.1-6.4-14.7-10.2-24.1-10.2c-34.9 0-46.3 46.9-14.4 62.8c-1.1 5-1.7 10.2-1.7 15.5c0 52.6 59.2 95.2 132 95.2c73.1 0 132.3-42.6 132.3-95.2c0-5.3-.6-10.8-1.9-15.8c31.3-16 19.8-62.5-14.9-62.5M302.8 331c-18.2 18.2-76.1 17.9-93.6 0c-2.2-2.2-6.1-2.2-8.3 0c-2.5 2.5-2.5 6.4 0 8.6c22.8 22.8 87.3 22.8 110.2 0c2.5-2.2 2.5-6.1 0-8.6c-2.2-2.2-6.1-2.2-8.3 0m7.7-75c-13.6 0-24.6 11.1-24.6 24.9c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.1 24.9-24.6c0-13.8-11-24.9-24.9-24.9\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":801},"\u003Cpath fill=\"currentColor\" d=\"M512 194.8c0 101.3-82.4 183.8-183.8 183.8c-101.7 0-184.4-82.4-184.4-183.8c0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8M0 501.5h90v-491H0z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":803},"\u003Cpath fill=\"currentColor\" d=\"m20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379c-.197-.069-.42-.098-.57-.241c-.152-.143-.196-.366-.231-.572c-.065-.378-.125-.756-.192-1.133c-.057-.325-.102-.69-.25-.987c-.195-.4-.597-.634-.996-.788a6 6 0 0 0-.626-.194c-1-.263-2.05-.36-3.077-.416a26 26 0 0 0-3.7.062c-.915.083-1.88.184-2.75.5c-.318.116-.646.256-.888.501c-.297.302-.393.77-.177 1.146c.154.267.415.456.692.58c.36.162.737.284 1.123.366c1.075.238 2.189.331 3.287.37q1.829.074 3.65-.118q.449-.05.896-.119c.352-.054.578-.513.474-.834c-.124-.383-.457-.531-.834-.473c-.466.074-.96.108-1.382.146q-1.767.12-3.536.006a22 22 0 0 1-1.157-.107c-.086-.01-.18-.025-.258-.036q-.364-.055-.724-.13c-.111-.027-.111-.185 0-.212h.005q.416-.09.838-.147h.002c.131-.009.263-.032.394-.048a25 25 0 0 1 3.426-.12q1.011.029 2.017.144l.228.031q.4.06.798.145c.392.085.895.113 1.07.542c.055.137.08.288.111.431l.319 1.484a.237.237 0 0 1-.199.284h-.003l-.112.015a37 37 0 0 1-4.743.295a37 37 0 0 1-4.699-.304c-.14-.017-.293-.042-.417-.06c-.326-.048-.649-.108-.973-.161c-.393-.065-.768-.032-1.123.161c-.29.16-.527.404-.675.701c-.154.316-.199.66-.267 1c-.069.34-.176.707-.135 1.056c.087.753.613 1.365 1.37 1.502a39.7 39.7 0 0 0 11.343.376a.483.483 0 0 1 .535.53l-.071.697l-1.018 9.907c-.041.41-.047.832-.125 1.237c-.122.637-.553 1.028-1.182 1.171q-.868.197-1.756.205c-.656.004-1.31-.025-1.966-.022c-.699.004-1.556-.06-2.095-.58c-.475-.458-.54-1.174-.605-1.793l-.731-7.013l-.322-3.094c-.037-.351-.286-.695-.678-.678c-.336.015-.718.3-.678.679l.228 2.185l.949 9.112c.147 1.344 1.174 2.068 2.446 2.272c.742.12 1.503.144 2.257.156c.966.016 1.942.053 2.892-.122c1.408-.258 2.465-1.198 2.616-2.657l1.024-9.995l.215-2.087a.48.48 0 0 1 .39-.426c.402-.078.787-.212 1.074-.518c.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233c-2.416.359-4.866.54-7.308.46c-1.748-.06-3.477-.254-5.207-.498c-.17-.024-.353-.055-.47-.18c-.22-.236-.111-.71-.054-.995c.052-.26.152-.609.463-.646c.484-.057 1.046.148 1.526.22q.865.132 1.737.212c2.48.226 5.002.19 7.472-.14q.675-.09 1.345-.21c.399-.072.84-.206 1.08.206c.166.281.188.657.162.974a.54.54 0 0 1-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a6 6 0 0 1-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38c0 0 1.243.065 1.658.065c.447 0 1.786-.065 1.786-.065c.783 0 1.434-.6 1.499-1.38l.94-9.95a4 4 0 0 0-1.322-.238c-.826 0-1.491.284-2.26.613\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":805},"\u003Cpath fill=\"currentColor\" d=\"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134c-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9c152.3 0 165.1-3.7 204 11.4c60.1 23.3 65.6 79.5 44 140.3c-21.5 62.6-72.5 89.5-140.1 90.3c-43.4.7-69.5-7-75.3 24.2M357.1 152c-1.8-1.3-2.5-1.8-3 1.3c-2 11.4-5.1 22.5-8.8 33.6c-39.9 113.8-150.5 103.9-204.5 103.9c-6.1 0-10.1 3.3-10.9 9.4c-22.6 140.4-27.1 169.7-27.1 169.7c-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9c.7-5.4-1.1 6.1 14.4-91.3c4.6-22 14.3-19.7 29.3-19.7c71 0 126.4-28.8 142.9-112.3c6.5-34.8 4.6-71.4-23.8-92.6\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":807},"\u003Cpath fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8m0 448c-110.532 0-200-89.431-200-200c0-110.495 89.472-200 200-200c110.491 0 200 89.471 200 200c0 110.53-89.431 200-200 200m107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516c17.561-9.845 28.324-16.541 28.324-29.579c0-17.246-21.999-28.693-39.784-28.693c-23.189 0-33.894 10.977-48.942 29.969c-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8M298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42s18.841-42 42-42s42 18.841 42 42\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":809},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 12H5m7 7l-7-7l7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":811},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1794232713267]