[{"data":1,"prerenderedAt":1042},["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-\u002Fcanonical-urls-for-asp-net-mvc\u002F":37,"post-navigation":653,"i-fa-solid:share-alt":1022,"i-fa-brands:facebook":1024,"i-fa-brands:twitter":1026,"i-fa-brands:reddit":1028,"i-fa-brands:patreon":1030,"i-simple-icons:buymeacoffee":1032,"i-fa-brands:paypal":1034,"i-fa-regular:question-circle":1036,"i-feather:arrow-left":1038,"i-feather:arrow-right":1040},{"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":484,"date":630,"dateModified":631,"description":632,"extension":633,"headings":634,"heroImage":643,"meta":644,"path":92,"permalink":92,"published":645,"stem":646,"tags":647,"timeToRead":652},"posts\u002Fposts\u002F2015\u002Fcanonical-urls-for-asp-net-mvc\u002Findex.md","Canonical URL's for ASP.NET MVC","Muhammad Rehan Saeed",{"type":42,"value":43,"toc":481},"minimark",[44,111,123,150,153,156,187,190,196,199,210,219,233,236,257,271,274,279,282,290,293,307,314,331,334,340,343,352,367,384,387,403,419,433,439,442,451,465,477],[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,93],{},[48,89,90],{},[51,91,39],{"href":92},"\u002Fcanonical-urls-for-asp-net-mvc\u002F",[48,94,95],{},[51,96,98],{"href":97},"\u002Fdynamically-generating-robots-txt-using-asp-net-mvc","Dynamically 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,122],{},"The aim of this post is to give your site better search engine rankings using special ",[51,115,85],{"href":116,"rel":117,"target":121},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSearch_engine_optimization",[118,119,120],"nofollow","noopener","noreferrer","_blank"," techniques. Take a look at the URL's below and see if you can spot the differences between them:",[124,125,126,132,138,144],"ol",{},[48,127,128],{},[51,129,130],{"href":130,"rel":131,"target":121},"http:\u002F\u002Fexample.com\u002Fone\u002Ftwo\u002F",[118,119,120],[48,133,134],{},[51,135,136],{"href":136,"rel":137,"target":121},"https:\u002F\u002Fexample.com\u002Fone\u002Ftwo\u002F",[118,119,120],[48,139,140],{},[51,141,142],{"href":142,"rel":143,"target":121},"http:\u002F\u002Fexample.com\u002Fone\u002Ftwo",[118,119,120],[48,145,146],{},[51,147,148],{"href":148,"rel":149,"target":121},"http:\u002F\u002Fexample.com\u002FOne\u002FTwo",[118,119,120],[58,151,152],{},"The second one has a HTTPS scheme, the third omits the trailing slash and the fourth has mixed case characters. All of the URL's point to the same resource but it turns out that search engines treat every one of these URL's as unique and different. Search engines give each URL a page rank, which determines where the resource will show up in the search results. Another term you will also hear quite often is 'link juice'. The link juice conceptualizes how page rank flows between pages and websites.",[58,154,155],{},"If your site exposes the above four different URL's to the single resource, your link juice is being spread against each one and as a result, that will be having a detrimental impact on your page rank.",[157,158,161,167],"h1",{"id":159,"data-section-heading":160},"the-canonical-link-tag","",[162,163,166],"span",{"className":164},[165],"heading__text","The Canonical Link Tag",[168,169,172],"anchor-link",{"href":170,"label":171},"#the-canonical-link-tag","Link to this section",[173,174,181],"svg",{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,"true",[182,183],"path",{"fill":184,"fill-rule":185,"d":186},"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,188,189],{},"One way to solve this problem is to add a canonical link tag to the head of your HTML page. This tells search engines what the canonical (actual) URL to the page is. The link tag contains a URL to your preferred URL for the page.",[191,192],"pre",{"className":193,"language":194,"meta":160,"style":160,"html":195},"language-html shiki shiki-themes light-plus monokai","html","\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">link\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> rel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"canonical\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> href\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"http:\u002F\u002Fexample.com\u002Fone\u002Ftwo\u002F\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[58,197,198],{},"One thing you must decide early on is your preferred URL for every page. You must ask yourself the following questions and use the resulting URL in your canonical link tag.",[124,200,201,204,207],{},[48,202,203],{},"Do I prefer this page to be HTTP or HTTPS? This is yet another reason to go with HTTPS across your entire site.",[48,205,206],{},"Should the URL end with a trailing slash? This is often preferred over omitting it but it's a matter of preference.",[48,208,209],{},"Should I allow a mix of upper-case and lower-case characters? Most sites choose to go with all lower-case characters.",[58,211,212,213,218],{},"When search engines follow a link to your page, regardless of which URL they followed to get to your page, all of the link juice will be given to the URL specified in your canonical link tag. Google goes into a lot more depth about this tag ",[51,214,217],{"href":215,"rel":216,"target":121},"http:\u002F\u002Fgooglewebmastercentral.blogspot.co.uk\u002F2009\u002F02\u002Fspecify-your-canonical.html",[118,119,120],"here",".",[157,220,222,226],{"id":221,"data-section-heading":160},"301-permanent-redirects",[162,223,225],{"className":224},[165],"301 Permanent Redirects",[168,227,229],{"href":228,"label":171},"#301-permanent-redirects",[173,230,231],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,232],{"fill":184,"fill-rule":185,"d":186},[58,234,235],{},"Unfortunately, using the canonical link tag is not the recommended approach. The intention is that it should only be used to retrofit older websites, so they can become optimized for search engines.",[58,237,238,239,244,245,250,251,256],{},"According to both ",[51,240,243],{"href":241,"rel":242,"target":121},"http:\u002F\u002Fgooglewebmastercentral.blogspot.co.uk\u002F2010\u002F04\u002Fto-slash-or-not-to-slash.html",[118,119,120],"Google"," and ",[51,246,249],{"href":247,"rel":248,"target":121},"http:\u002F\u002Fblogs.bing.com\u002Fwebmaster\u002F2012\u002F01\u002F26\u002Fmoving-content-think-301-not-relcanonical",[118,119,120],"Bing",", the recommended approach if you visit a non-preferred format of your pages URL is to perform a ",[51,252,255],{"href":253,"rel":254,"target":121},"https:\u002F\u002Fmoz.com\u002Flearn\u002Fseo\u002Fredirection",[118,119,120],"301 permanent redirect"," to the preferred canonical URL. According to them, you only lose a tiny amount of link juice by doing a 301 permanent redirect.",[157,258,260,264],{"id":259,"data-section-heading":160},"canonical-urls-in-mvc",[162,261,263],{"className":262},[165],"Canonical URL's in MVC",[168,265,267],{"href":266,"label":171},"#canonical-urls-in-mvc",[173,268,269],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,270],{"fill":184,"fill-rule":185,"d":186},[58,272,273],{},"ASP.NET MVC 5 and ASP.NET Core have two settings you can use to automatically create canonical URL's every time you generate URL's.",[191,275],{"className":276,"language":277,"meta":160,"style":160,"html":278},"language-cs shiki shiki-themes light-plus monokai","cs","\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F Append a trailing slash to all URL's.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">RouteTable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Routes\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AppendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F Ensure that all URL's are lower-case.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">RouteTable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Routes\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">LowercaseUrls\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>",[191,280],{"className":276,"language":277,"meta":160,"style":160,"html":281},"\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">services\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ConfigureRouting\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">    routeOptions\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\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 Append a trailing slash to all URL's.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        routeOptions\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AppendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F Ensure that all URL's are lower-case.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        routeOptions\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">LowercaseUrls\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    });\n\u003C\u002Fspan>\u003C\u002Fspan>",[58,283,284,285,289],{},"Once you apply these settings and are using the ",[286,287,288],"code",{},"UrlHelper"," to generate all your URL's, you will see that across your site all URL's are lower-case and all end with a trailing slash (This is just my personal preference you may not like trailing slashes).",[58,291,292],{},"This means that within your site, no 301 permanent redirects to canonical URL's are required because the URL's are already canonical. However, this just solves part of the problem. What about external links to your site? What happens when people copy and paste your site and delete or add a trailing slash? What happens when someone types in a link to your site and puts in an upper-case character? The fact is you have no control over external links and when search engine crawlers follow those non-canonical links you will be losing valuable link juice.",[157,294,296,300],{"id":295,"data-section-heading":160},"301-permanent-redirects-in-mvc",[162,297,299],{"className":298},[165],"301 Permanent Redirects in MVC",[168,301,303],{"href":302,"label":171},"#301-permanent-redirects-in-mvc",[173,304,305],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,306],{"fill":184,"fill-rule":185,"d":186},[58,308,309,310,313],{},"Enter the ",[286,311,312],{},"RedirectToCanonicalUrlAttribute",". This is an MVC filter you can apply, which will check that the URL from each request is canonical. If it is, it does nothing and MVC returns the view in its response as normal. If the URL is not canonical, it generates the canonical URL based on the above MVC settings and returns a 301 permanent redirect response to the client. The client can then make another request to the correct canonical URL.",[58,315,316,317,319,320,244,323,326,327,218],{},"You can take a look at the source code for the ",[286,318,312],{},", ",[286,321,322],{},"NoTrailingSlashAttribute",[286,324,325],{},"NoLowercaseQueryStringAttribute","'s (I shall explain in a minute) for MVC 5 below or the ASP.NET Core version ",[51,328,217],{"href":329,"rel":330,"target":121},"https:\u002F\u002Fgithub.com\u002FDotnet-Boxed\u002FFramework",[118,119,120],[191,332],{"className":276,"language":277,"meta":160,"style":160,"html":333},"\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F To improve Search Engine Optimization SEO, there should only be a single URL for each resource. Case \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F differences and\u002For URL's with\u002Fwithout trailing slashes are treated as different URL's by search engines. This \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F filter redirects all non-canonical URL's based on the settings specified to their canonical equivalent. \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F Note: Non-canonical URL's are not generated by this site template, it is usually external sites which are \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F linking to your site but have changed the URL case or added\u002Fremoved trailing slashes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F (See Google's comments at http:\u002F\u002Fgooglewebmastercentral.blogspot.co.uk\u002F2010\u002F04\u002Fto-slash-or-not-to-slash.html\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F and Bing's at http:\u002F\u002Fblogs.bing.com\u002Fwebmaster\u002F2012\u002F01\u002F26\u002Fmoving-content-think-301-not-relcanonical).\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AttributeUsage\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Method\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> |\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Class\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Inherited\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AllowMultiple\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RedirectToCanonicalUrlAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">FilterAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">IAuthorizationFilter\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> const\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> char\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> QueryCharacter\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> '?'\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> const\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> char\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> '\u002F'\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> readonly\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> appendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> readonly\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> lowercaseUrls\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Initializes a new instance of the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RedirectToCanonicalUrlAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\"> \u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> class.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"appendTrailingSlash\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">If set to \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> append trailing slashes, otherwise strip trailing \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F slashes.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"lowercaseUrls\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">If set to \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> lower-case all URL's.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> RedirectToCanonicalUrlAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> appendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> lowercaseUrls\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=\"sK46n\">        this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">appendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> appendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">        this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">lowercaseUrls\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> lowercaseUrls\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Gets a value indicating whether to append trailing slashes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if appending trailing slashes; otherwise, strip trailing slashes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> AppendTrailingSlash\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        get\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"smL5M\">return\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">appendTrailingSlash\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Gets a value indicating whether to lower-case all URL's.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if lower-casing URL's; otherwise, \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> LowercaseUrls\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        get\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"smL5M\">return\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">lowercaseUrls\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Determines whether the HTTP request contains a non-canonical URL using \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"TryGetCanonicalUrl\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">, \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F if it doesn't calls the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"HandleNonCanonicalRequest\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> method.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">An object that encapsulates information that is required in order to use the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RedirectToCanonicalUrlAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">exception\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"ArgumentNullException\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">paramref\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> parameter is \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">null\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">exception\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnAuthorization\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\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\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\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\">            throw\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ArgumentNullException\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">nameof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Equals\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">HttpContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Request\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">HttpMethod\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"GET\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">StringComparison\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Ordinal\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=\"sJvqV\">            string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">TryGetCanonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">out\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HandleNonCanonicalRequest\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\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\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Determines whether the specified URl is canonical and if it is not, outputs the canonical URL.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">An object that encapsulates information that is required in order to use the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RedirectToCanonicalUrlAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\"> \u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"canonicalUrl\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The canonical URL.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the URL is canonical, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> TryGetCanonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">out\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\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=\"sJvqV\">        bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">        Uri\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> url\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">HttpContext\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\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> url\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToString\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IndexOf\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">QueryCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F If we are not dealing with the home page. Note, the home page is a special case and it doesn't matter\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F if there is a trailing slash or not. Both will be treated as the same by search engines.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">url\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AbsolutePath\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Length\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &gt;\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\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\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">1\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=\"sJvqV\">                bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> hasTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Length\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"snCLD\">==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">appendTrailingSlash\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 Append a trailing slash to the end of the URL.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">hasTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &amp;&amp;\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HasNoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> +=\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\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=\"smL5M\">                else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">                    \u002F\u002F Trim a trailing slash from the end of the URL.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">hasTrailingSlash\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">TrimEnd\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\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\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">                bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> hasTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"snCLD\">==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">appendTrailingSlash\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 Append a trailing slash to the end of the URL but before the query string.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">hasTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &amp;&amp;\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HasNoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Insert\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToString\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">());\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\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=\"smL5M\">                else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">                    \u002F\u002F Trim a trailing slash to the end of the URL but before the query string.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">hasTrailingSlash\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Remove\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"s0PsH\">1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\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\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">lowercaseUrls\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\">            foreach\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">char\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> character\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> in\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\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\">                if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HasNoLowercaseQueryStringAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">&amp;&amp;\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !=\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">1\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\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">character\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> QueryCharacter\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\">                        break\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">char\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsUpper\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">character\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">&amp;&amp;\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HasNoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Substring\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">0\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">).\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToLower\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">() \u003C\u002Fspan>\u003Cspan class=\"snCLD\">+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                            canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Substring\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Length\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> queryIndex\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                        break\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=\"smL5M\">                else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">char\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsUpper\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">character\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">&amp;&amp;\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HasNoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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\">                        canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToLower\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        isCanonical\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                        break\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\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        return\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> isCanonical\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Handles HTTP requests for URL's that are not canonical. Performs a 301 Permanent Redirect to the canonical URL.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">An object that encapsulates information that is required in order to use the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RedirectToCanonicalUrlAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\"> \u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"canonicalUrl\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The canonical URL.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> HandleNonCanonicalRequest\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\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\">        filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Result\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RedirectResult\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">true\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Determines whether the specified action or its controller has the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NoTrailingSlashAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F attribute specified.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The filter context.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if a \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NoTrailingSlashAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute is specified, otherwise \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> HasNoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\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=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ActionDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsDefined\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">typeof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">||\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ActionDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ControllerDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsDefined\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">typeof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">false\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Determines whether the specified action or its controller has the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NoLowercaseQueryStringAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F attribute specified.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The filter context.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if a \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NoLowercaseQueryStringAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute is specified, otherwise \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> HasNoLowercaseQueryStringAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\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=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ActionDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsDefined\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">typeof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoLowercaseQueryStringAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">||\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ActionDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ControllerDescriptor\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsDefined\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">typeof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoLowercaseQueryStringAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">), \u003C\u002Fspan>\u003Cspan class=\"sMc8R\">false\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F Requires that a HTTP request does not contain a trailing slash. If it does, return a 404 Not Found. This is \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F useful if you are dynamically generating something which acts like it's a file on the web server. \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F E.g. \u002FRobots.txt\u002F should not have a trailing slash and should be \u002FRobots.txt. Note, that we also don't care if \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F it is upper-case or lower-case in this instance.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AttributeUsage\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Method\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> |\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Class\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Inherited\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AllowMultiple\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> NoTrailingSlashAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">FilterAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">IAuthorizationFilter\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> const\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> char\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> QueryCharacter\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> '?'\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> const\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> char\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> '\u002F'\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Determines whether a request contains a trailing slash and, if it does, calls the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"HandleTrailingSlashRequest\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> method.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">An object that encapsulates information that is required in order to use the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RequireHttpsAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">exception\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"ArgumentNullException\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">paramref\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> parameter is null.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">exception\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnAuthorization\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\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\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\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\">            throw\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ArgumentNullException\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">nameof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">HttpContext\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=\"sWm5y\">ToString\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IndexOf\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">QueryCharacter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">1\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\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Length\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"snCLD\">==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HandleTrailingSlashRequest\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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=\"smL5M\">        else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">canonicalUrl\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">queryIndex\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 1\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"snCLD\">==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> SlashCharacter\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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">HandleTrailingSlashRequest\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">filterContext\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\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Handles HTTP requests that have a trailing slash but are not meant to.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"filterContext\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">An object that encapsulates information that is required in order to use the \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"RequireHttpsAttribute\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> attribute.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> HandleTrailingSlashRequest\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AuthorizationContext\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> filterContext\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\">        filterContext\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Result\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> HttpNotFoundResult\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F Ensures that a HTTP request URL can contain query string parameters with both upper-case and lower-case \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F characters.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">\u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sw29p\">AttributeUsage\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Method\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> |\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> AttributeTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Class\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Inherited\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AllowMultiple\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> NoLowercaseQueryStringAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">FilterAttribute\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,335,336,337,339],{},"Adding the ",[286,338,312],{}," filter is easy. You can add it to the global filters collection so all requests will be handled by it like so:",[191,341],{"className":276,"language":277,"meta":160,"style":160,"html":342},"\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">GlobalFilters\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Filters\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RedirectToCanonicalUrlAttribute\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">    RouteTable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Routes\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">AppendTrailingSlash\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">    RouteTable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Routes\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">LowercaseUrls\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>",[58,344,345,346,348,349,351],{},"That's it! It's as simple as that! Now there are two special cases, which is where the ",[286,347,322],{}," and ",[286,350,325],{}," filters comes in.",[353,354,356,360],"h2",{"id":355,"data-section-heading":160},"special-case-1",[162,357,359],{"className":358},[165],"Special Case 1",[168,361,363],{"href":362,"label":171},"#special-case-1",[173,364,365],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,366],{"fill":184,"fill-rule":185,"d":186},[58,368,369,370,373,374,377,378,380,381,383],{},"Say you want to have the following action method where visiting ",[286,371,372],{},"http:\u002F\u002Fexample.com\u002Frobots.txt"," returns a text result. We want the client to think it's just visiting a static ",[286,375,376],{},"robots.txt"," file but in reality we are dynamically generating it (One reason for doing this is that a ",[286,379,376],{}," file must contain an absolute URL and you want to use the ",[286,382,288],{}," to just handle that, no matter what domain the site is running under).",[191,385],{"className":276,"language":277,"meta":160,"style":160,"html":386},"\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoTrailingSlash\u003C\u002Fspan>\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\">)]\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=\"sJvqV\">    string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> content\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">robotsService\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">GetRobotsText\u003C\u002Fspan>\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\">content\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ContentType\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Text\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>",[58,388,389,390,392,393,395,396,399,400,402],{},"Adding a trailing slash to ",[286,391,376],{}," would just be weird. Also, the last thing you want to do when search engines try to visit ",[286,394,372],{}," is 301 permanent redirect them to ",[286,397,398],{},"http:\u002F\u002Fexample.com\u002Frobots.txt\u002F",". So we add the ",[286,401,322],{}," filter.",[58,404,405,406,408,409,411,412,415,416,418],{},"The ",[286,407,312],{}," knows about the ",[286,410,322],{}," filter and when it sees it and we make a request to the above action, it ignores the ",[286,413,414],{},"AppendTrailingSlash"," setting and it works just like requesting a static ",[286,417,376],{}," file from the file system.",[353,420,422,426],{"id":421,"data-section-heading":160},"special-case-2",[162,423,425],{"className":424},[165],"Special Case 2",[168,427,429],{"href":428,"label":171},"#special-case-2",[173,430,431],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,432],{"fill":184,"fill-rule":185,"d":186},[58,434,435,436,438],{},"Sometimes you want your query string parameters to be a mix of upper-case and lower-case. When you want to do this, simply add the ",[286,437,325],{}," attribute to the action method like so:",[191,440],{"className":276,"language":277,"meta":160,"style":160,"html":441},"\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sw29p\">NoLowercaseQueryString\u003C\u002Fspan>\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\">\"action\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> Action\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> mixedCaseParameter\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 mixedCaseParameter can contain upper and lower case characters.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[58,443,444,445,447,448,218],{},"If you are using the ASP.NET Identity NuGet package for authentication, then take note, you need to apply the ",[286,446,325],{}," to the ",[286,449,450],{},"AccountController",[157,452,454,458],{"id":453,"data-section-heading":160},"conclusions",[162,455,457],{"className":456},[165],"Conclusions",[168,459,461],{"href":460,"label":171},"#conclusions",[173,462,463],{"xmlns":175,"xmlns:xlink":176,"viewBox":177,"version":178,"width":179,"height":179,"aria-hidden":180},[182,464],{"fill":184,"fill-rule":185,"d":186},[58,466,467,468,472,473,218],{},"Once again, you can find a working example of this and much more using the ",[51,469,54],{"href":470,"rel":471,"target":121},"https:\u002F\u002Fvisualstudiogallery.msdn.microsoft.com\u002F6cf50a48-fc1e-4eaf-9e82-0b2a6705ca7d",[118,119,120]," project template or view the source code directly on ",[51,474,476],{"href":329,"rel":475,"target":121},[118,119,120],"GitHub",[478,479,480],"style",{},"html pre.shiki code .s1q82, html code.shiki .s1q82{--shiki-default:#008000;--shiki-dark:#88846F}html pre.shiki code .sFrd5, html code.shiki .sFrd5{--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sjLUg, html code.shiki .sjLUg{--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .snCLD, html code.shiki .snCLD{--shiki-default:#000000;--shiki-dark:#F92672}html pre.shiki code .sMc8R, html code.shiki .sMc8R{--shiki-default:#0000FF;--shiki-dark:#AE81FF}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 .sWm5y, html code.shiki .sWm5y{--shiki-default:#795E26;--shiki-dark:#A6E22E}html pre.shiki code .sOBmp, html code.shiki .sOBmp{--shiki-default:#800000;--shiki-dark:#88846F}html pre.shiki code .sjbfc, html code.shiki .sjbfc{--shiki-default:#800000;--shiki-dark:#F92672}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 .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 .swiDo, html code.shiki .swiDo{--shiki-default:#A31515;--shiki-dark:#E6DB74}html pre.shiki code .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}html pre.shiki code .sK46n, html code.shiki .sK46n{--shiki-default:#0000FF;--shiki-dark:#FD971F}html pre.shiki code .smL5M, html code.shiki .smL5M{--shiki-default:#AF00DB;--shiki-dark:#F92672}html pre.shiki code .s0PsH, html code.shiki .s0PsH{--shiki-default:#098658;--shiki-dark:#AE81FF}html pre.shiki code .sNflI, html code.shiki .sNflI{--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .squEy, html code.shiki .squEy{--shiki-default:#0000FF;--shiki-dark:#E6DB74}",{"title":160,"searchDepth":482,"depth":482,"links":483},2,[],{"issue":485,"comments":489},{"number":486,"title":487,"html_url":488},62,"[Comment] Canonical URL's for ASP.NET MVC","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62",[490,502,510,518,526,534,542,550,558,566,574,582,590,598,606,614,622],{"id":491,"html_url":492,"body_html":493,"created_at":494,"updated_at":494,"author_association":495,"user":496,"reactions":500},627249595,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249595","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F0b56d5256f8b88bb7c643ffadd1494c97613a9f47ece407fd5261d7a72126121\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30336339383031383737376362653436366635326666653334666239633937363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Jasvinder\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F0b56d5256f8b88bb7c643ffadd1494c97613a9f47ece407fd5261d7a72126121\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30336339383031383737376362653436366635326666653334666239633937363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fcheckpnrstatusonly.com\u002F\">Jasvinder\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-01-06 12:00:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>URL Canonicalization seems to be quite new topic to me, being a newbie. Although, I have read some guides, but still i have one confusion, Do I need to add URL Canonical Tag in every page of my site?\u003C\u002Fp>","2020-05-12T10:16:18Z","OWNER",{"login":497,"avatar_url":498,"html_url":499},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":501,"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\u002F627249595\u002Freactions",{"id":503,"html_url":504,"body_html":505,"created_at":506,"updated_at":506,"author_association":495,"user":507,"reactions":508},627249653,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249653","\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-01-07 16:27:18\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>URL Canonicalization seems to be quite new topic to me, being a newbie. Although, I have read some guides, but still i have one confusion, Do I need to add URL Canonical Tag in every page of my site?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>It's just a filter, so you can if you want to. The main idea of it though is to put it at the root and then use the NoTrailingSlashAttribute or \u003Ccode>NoLowercaseQueryStringAttribute\u003C\u002Fcode> to tweak how it works when you have an exception to the rule.\u003C\u002Fp>","2020-05-12T10:16:25Z",{"login":497,"avatar_url":498,"html_url":499},{"url":509,"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\u002F627249653\u002Freactions",{"id":511,"html_url":512,"body_html":513,"created_at":514,"updated_at":514,"author_association":495,"user":515,"reactions":516},627249721,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249721","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F936ec96928637419ff844351946ebe2eac691fa6e5c96aafe9eb60e298e3a751\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32646438656136623061356366623238323165333361356666653136643332653f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Tiger\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F936ec96928637419ff844351946ebe2eac691fa6e5c96aafe9eb60e298e3a751\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32646438656136623061356366623238323165333361356666653136643332653f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Tiger\u003C\u002Fstrong> commented on \u003Cstrong>2016-05-15 21:44:43\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Fantastic post - great that you shown options in mvc5 and mvc6\u003C\u002Fp>","2020-05-12T10:16:32Z",{"login":497,"avatar_url":498,"html_url":499},{"url":517,"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\u002F627249721\u002Freactions",{"id":519,"html_url":520,"body_html":521,"created_at":522,"updated_at":522,"author_association":495,"user":523,"reactions":524},627249790,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249790","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Doron Grinzaig\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fyooocan.com\u002F\">Doron Grinzaig\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-10-08 21:11:29\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi Rehan,\u003Cbr \u002F>\nI follow many of your post and work, great job man! thanks for helping the community!\u003C\u002Fp>\n\u003Cp>Curious to know if you have something to automate things like these:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Home\u002FTermsOfUse\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"HomeTermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>ActionResult\u003C\u002Fspan> \u003Cspan>TermsOfUse\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>Request\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetDisplayUrl\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Contains\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"\u002FHome\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>return\u003C\u002Fspan> \u003Cspan>RedirectToRoutePermanent\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>return\u003C\u002Fspan> \u003Cspan>View\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\n\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Home\u002FPrivacy\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"HomePrivacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>ActionResult\u003C\u002Fspan> \u003Cspan>Privacy\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>Request\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetDisplayUrl\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Contains\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"\u002FHome\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>return\u003C\u002Fspan> \u003Cspan>RedirectToRoutePermanent\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>return\u003C\u002Fspan> \u003Cspan>View\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:16:40Z",{"login":497,"avatar_url":498,"html_url":499},{"url":525,"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\u002F627249790\u002Freactions",{"id":527,"html_url":528,"body_html":529,"created_at":530,"updated_at":530,"author_association":495,"user":531,"reactions":532},627249845,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249845","\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-10-09 11:05:01\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi Rehan,\u003Cbr \u002F>\nI follow many of your post and work, great job man! thanks for helping the community!\u003C\u002Fp>\n\u003Cp>Curious to know if you have something to automate things like these:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Home\u002FTermsOfUse\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"HomeTermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>ActionResult\u003C\u002Fspan> \u003Cspan>TermsOfUse\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>Request\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetDisplayUrl\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Contains\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"\u002FHome\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>return\u003C\u002Fspan> \u003Cspan>RedirectToRoutePermanent\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"TermsOfUse\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>return\u003C\u002Fspan> \u003Cspan>View\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\n\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>[\u003C\u002Fspan>\u003Cspan>Route\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Home\u002FPrivacy\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Name\u003C\u002Fspan>\u003Cspan>=\u003C\u002Fspan> \u003Cspan>\"HomePrivacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>ActionResult\u003C\u002Fspan> \u003Cspan>Privacy\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>Request\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetDisplayUrl\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Contains\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"\u002FHome\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>return\u003C\u002Fspan> \u003Cspan>RedirectToRoutePermanent\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"Privacy\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>return\u003C\u002Fspan> \u003Cspan>View\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fblockquote>\n\u003Cp>Looks like you want to the response \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002Faspnet\u002FBasicMiddleware\u002Ftree\u002Fdev\u002Fsrc\u002FMicrosoft.AspNetCore.Rewrite\">Rewrite middleware\u003C\u002Fa>.\u003C\u002Fp>","2020-05-12T10:16:48Z",{"login":497,"avatar_url":498,"html_url":499},{"url":533,"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\u002F627249845\u002Freactions",{"id":535,"html_url":536,"body_html":537,"created_at":538,"updated_at":538,"author_association":495,"user":539,"reactions":540},627249904,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249904","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Doron Grinzaig\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fyooocan.com\u002F\">Doron Grinzaig\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-11-29 20:05:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Fantastic post - great that you shown options in mvc5 and mvc6\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Just got here back because of inbound links report.\u003Cbr \u002F>\nFirst, thank you for promoting our website on your blog!\u003Cbr \u002F>\nSecond, I must ask, aren't you afraid it will cause spam?\u003Cbr \u002F>\nLastly, (since we had massive spam bots recently) why aren't you using recpatcha?\u003Cbr \u002F>\nWe got dozens of Viagra spam messages!\u003C\u002Fp>","2020-05-12T10:16:55Z",{"login":497,"avatar_url":498,"html_url":499},{"url":541,"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\u002F627249904\u002Freactions",{"id":543,"html_url":544,"body_html":545,"created_at":546,"updated_at":546,"author_association":495,"user":547,"reactions":548},627249960,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627249960","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Doron Grinzaig\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fcfdc9cc47ec29c594789064be9a28e0c1483c97b0ead437933c209e1f41e4c64\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39626263343135326139616561323339373938373366383765633662343530663f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fyooocan.com\u002F\">Doron Grinzaig\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-11-29 20:10:03\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Looks like you want to the response \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002Faspnet\u002FBasicMiddleware\u002Ftree\u002Fdev\u002Fsrc\u002FMicrosoft.AspNetCore.Rewrite\">Rewrite middleware\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>(I accidentally replied to a wrong comment, not sure how it happened. Sorry.)\u003C\u002Fp>\n\u003Cp>Just got here back because of inbound links report.\u003Cbr \u002F>\nFirst, thank you for promoting our website on your blog!\u003Cbr \u002F>\nSecond, I must ask, aren't you afraid it will cause spam?\u003Cbr \u002F>\nLastly, (since we had massive spam bots recently) why aren't you using recpatcha?\u003Cbr \u002F>\nWe got dozens of Viagra spam messages!\u003C\u002Fp>","2020-05-12T10:17:02Z",{"login":497,"avatar_url":498,"html_url":499},{"url":549,"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\u002F627249960\u002Freactions",{"id":551,"html_url":552,"body_html":553,"created_at":554,"updated_at":554,"author_association":495,"user":555,"reactions":556},627250043,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250043","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3b8b597359a07d47dfbe6815093603a5a478da32f6572a908bdca6bfe3d31443\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30633037316131346562623635393237306163623935313638393164363735323f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Sandeep\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3b8b597359a07d47dfbe6815093603a5a478da32f6572a908bdca6bfe3d31443\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30633037316131346562623635393237306163623935313638393164363735323f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Sandeep\u003C\u002Fstrong> commented on \u003Cstrong>2016-12-01 05:45:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fexample.com\u002F\">http:\u002F\u002Fexample.com\u002F\u003C\u002Fa> and \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.example.com\u002F\">http:\u002F\u002Fwww.example.com\u002F\u003C\u002Fa> should resolve to the same URL, but currently do not. please help me how to solve this error..(mvc 4 application)\u003C\u002Fp>","2020-05-12T10:17:10Z",{"login":497,"avatar_url":498,"html_url":499},{"url":557,"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\u002F627250043\u002Freactions",{"id":559,"html_url":560,"body_html":561,"created_at":562,"updated_at":562,"author_association":495,"user":563,"reactions":564},627250109,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250109","\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-12-05 13:41:29\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fexample.com\u002F\">http:\u002F\u002Fexample.com\u002F\u003C\u002Fa> and \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.example.com\u002F\">http:\u002F\u002Fwww.example.com\u002F\u003C\u002Fa> should resolve to the same URL, but currently do not. please help me how to solve this error..(mvc 4 application)\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You usually do this using your host name providers services.\u003C\u002Fp>","2020-05-12T10:17:18Z",{"login":497,"avatar_url":498,"html_url":499},{"url":565,"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\u002F627250109\u002Freactions",{"id":567,"html_url":568,"body_html":569,"created_at":570,"updated_at":570,"author_association":495,"user":571,"reactions":572},627250166,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250166","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F1a394d94ff2d29585d2f13a208262ba68b6702d50ec5068a4d0b229943018659\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f37356639383039353731396634383266373937326534663430343130623833623f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Travis\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F1a394d94ff2d29585d2f13a208262ba68b6702d50ec5068a4d0b229943018659\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f37356639383039353731396634383266373937326534663430343130623833623f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Travis\u003C\u002Fstrong> commented on \u003Cstrong>2017-01-09 00:15:42\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Any idea on how to add this to Asp.net Core 1.1.0?  Best I can figure is it needs to be added in the services.AddMvc options set, but how do I add the routes items options?  (Doesn't seem routetable.routes is valid)\u003C\u002Fp>\n\u003Cp>Thanks!\u003C\u002Fp>","2020-05-12T10:17:25Z",{"login":497,"avatar_url":498,"html_url":499},{"url":573,"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\u002F627250166\u002Freactions",{"id":575,"html_url":576,"body_html":577,"created_at":578,"updated_at":578,"author_association":495,"user":579,"reactions":580},627250231,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250231","\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>2017-01-09 16:08:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Any idea on how to add this to Asp.net Core 1.1.0?  Best I can figure is it needs to be added in the services.AddMvc options set, but how do I add the routes items options?  (Doesn't seem routetable.routes is valid)\u003C\u002Fp>\n\u003Cp>Thanks!\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>The ASP.NET Core Boilerplate project template uses it. If you create a project from the template, you can see how to use it.\u003C\u002Fp>","2020-05-12T10:17:33Z",{"login":497,"avatar_url":498,"html_url":499},{"url":581,"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\u002F627250231\u002Freactions",{"id":583,"html_url":584,"body_html":585,"created_at":586,"updated_at":586,"author_association":495,"user":587,"reactions":588},627250295,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250295","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4041c73c7092f45e5a39d246593c8ef7a17a946a1c9c104bd16ac51e62af871c\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63623261316563386139393939353636316437373538623633343931316463613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Dima\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4041c73c7092f45e5a39d246593c8ef7a17a946a1c9c104bd16ac51e62af871c\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63623261316563386139393939353636316437373538623633343931316463613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Dima\u003C\u002Fstrong> commented on \u003Cstrong>2017-05-31 12:23:23\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Thanks Rehan,\u003C\u002Fp>\n\u003Cp>it's a great article from urlhelper to filters,\u003Cbr \u002F>\njust some customization following my needs and it works perfect.\u003Cbr \u002F>\nI tested my site with different SEO plugins  and result is awesome.\u003C\u002Fp>","2020-05-12T10:17:40Z",{"login":497,"avatar_url":498,"html_url":499},{"url":589,"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\u002F627250295\u002Freactions",{"id":591,"html_url":592,"body_html":593,"created_at":594,"updated_at":594,"author_association":495,"user":595,"reactions":596},627250361,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250361","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F82ea79e8d7a97578f91e8e6004beceff4372507b621078ca3fe58c94e684a245\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38353064613165316539376435313531316136653839353735333734363566333f733d393626643d6d6d26723d67\">\u003Cimg alt=\"pooria\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F82ea79e8d7a97578f91e8e6004beceff4372507b621078ca3fe58c94e684a245\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38353064613165316539376435313531316136653839353735333734363566333f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>pooria\u003C\u002Fstrong> commented on \u003Cstrong>2017-10-05 17:00:31\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>hi rehan\u003Cbr \u002F>\nit's a great work you are doing here\u003Cbr \u002F>\ni read and excute Successfully\u003Cbr \u002F>\nboth post \"dynamic site map \" and \"dynamic robot.txt\"  and i have xml sitemap in \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\">http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\u003C\u002Fa> but i want to now how serch engine now they must go to \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\">http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\u003C\u002Fa> not \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fsitemap.xml\">http:\u002F\u002Flocalhost:51515\u002Fsitemap.xml\u003C\u002Fa>\u003Cbr \u002F>\nThanks\u003C\u002Fp>","2020-05-12T10:17:48Z",{"login":497,"avatar_url":498,"html_url":499},{"url":597,"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\u002F627250361\u002Freactions",{"id":599,"html_url":600,"body_html":601,"created_at":602,"updated_at":602,"author_association":495,"user":603,"reactions":604},627250445,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250445","\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>2017-10-06 10:29:31\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>hi rehan\u003Cbr \u002F>\nit's a great work you are doing here\u003Cbr \u002F>\ni read and excute Successfully\u003Cbr \u002F>\nboth post \"dynamic site map \" and \"dynamic robot.txt\"  and i have xml sitemap in \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\">http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\u003C\u002Fa> but i want to now how serch engine now they must go to \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\">http:\u002F\u002Flocalhost:51515\u002Fhome\u002FSitemapXml\u003C\u002Fa> not \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:51515\u002Fsitemap.xml\">http:\u002F\u002Flocalhost:51515\u002Fsitemap.xml\u003C\u002Fa>\u003Cbr \u002F>\nThanks\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Google and Bing both have web pages where you can enter the URL to your sitemap.\u003C\u002Fp>","2020-05-12T10:17:55Z",{"login":497,"avatar_url":498,"html_url":499},{"url":605,"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\u002F627250445\u002Freactions",{"id":607,"html_url":608,"body_html":609,"created_at":610,"updated_at":610,"author_association":495,"user":611,"reactions":612},627250529,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250529","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fe1cf18cfd70cfbff790bc524e89cd8dd7dcfd946e37cf621400013b799f085ba\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61313038333836316231366166306262623266326161656566363433386663363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Brad Landis\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fe1cf18cfd70cfbff790bc524e89cd8dd7dcfd946e37cf621400013b799f085ba\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61313038333836316231366166306262623266326161656566363433386663363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fbradlis7.com\u002F\">Brad Landis\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2018-04-18 19:02:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Great post! A change I would recommend is to ignore ChildAction, otherwise, if a parent has one of the Ignore attributes (such as NoLowercaseQueryStringAttribute), the ChildAction might try to redirect, which results in a page error.\u003C\u002Fp>\n\u003Cp>Around line 83, insert this:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsChildAction\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan>\n  \u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Controller\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewBag\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>CanonicalUrl\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ParentActionViewContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Controller\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewBag\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>CanonicalUrl\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n  \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:18:04Z",{"login":497,"avatar_url":498,"html_url":499},{"url":613,"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\u002F627250529\u002Freactions",{"id":615,"html_url":616,"body_html":617,"created_at":618,"updated_at":618,"author_association":495,"user":619,"reactions":620},627250600,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250600","\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>2018-04-19 09:19:31\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Great post! A change I would recommend is to ignore ChildAction, otherwise, if a parent has one of the Ignore attributes (such as NoLowercaseQueryStringAttribute), the ChildAction might try to redirect, which results in a page error.\u003C\u002Fp>\n\u003Cp>Around line 83, insert this:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsChildAction\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan>\n  \u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Controller\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewBag\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>CanonicalUrl\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>filterContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ParentActionViewContext\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Controller\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewBag\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>CanonicalUrl\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n  \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fblockquote>\n\u003Cp>Yes, I actually got a PR in the ASP.NET Core Boilerplate Framework project that does just this. I just hadn't updated the blog post.\u003C\u002Fp>","2020-05-12T10:18:12Z",{"login":497,"avatar_url":498,"html_url":499},{"url":621,"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\u002F627250600\u002Freactions",{"id":623,"html_url":624,"body_html":625,"created_at":626,"updated_at":626,"author_association":495,"user":627,"reactions":628},627250656,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F62#issuecomment-627250656","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F88c0726caebd33294581b9d7398a6515b73cb81fff96fc9cfc8ac6577f793268\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66303339333366383531633865636332346439386466373266633262663561393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Hooman\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F88c0726caebd33294581b9d7398a6515b73cb81fff96fc9cfc8ac6577f793268\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66303339333366383531633865636332346439386466373266633262663561393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fshopless.co.nz\u002F\">Hooman\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2019-07-08 03:42:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi, thanks for the great post. So, if I do all the redirects, then I don't need to add any canonical links to my web pages? The reason ask is that I have heard that its best practice to always add canonical URL to our pages (though I have not really seen an official document to back this up, hence the question)\u003C\u002Fp>","2020-05-12T10:18:19Z",{"login":497,"avatar_url":498,"html_url":499},{"url":629,"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\u002F627250656\u002Freactions","2015-07-14T00:00:00+00:00",null,"Use canonical URL's in ASP.NET MVC for better Search Engine Optimization (SEO) using ASP.NET Core Boilerplate and the RedirectToCanonicalUrlAttribute.","md",[635,637,638,639,640,641,642],{"depth":636,"value":166},1,{"depth":636,"value":225},{"depth":636,"value":263},{"depth":636,"value":299},{"depth":482,"value":359},{"depth":482,"value":425},{"depth":636,"value":457},"\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{},true,"posts\u002F2015\u002Fcanonical-urls-for-asp-net-mvc\u002Findex",[648,649,650,54,651,85],".NET","ASP.NET Core","ASP.NET MVC","C#",11,[654,658,662,667,672,675,678,682,686,690,693,697,702,705,708,712,716,720,723,726,730,734,737,740,743,747,750,752,755,758,760,763,766,767,770,774,777,781,785,789,793,797,801,805,808,812,816,820,824,827,831,835,838,841,845,849,854,858,862,866,870,874,878,881,884,887,891,895,898,902,905,908,911,914,918,922,925,928,932,936,939,942,945,949,953,957,961,964,967,972,975,978,982,985,989,993,996,1000,1003,1006,1010,1014,1018],{"title":655,"permalink":656,"heroImage":657,"timeToRead":636},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":659,"permalink":660,"heroImage":661,"timeToRead":482},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":663,"permalink":664,"heroImage":665,"timeToRead":666},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",3,{"title":668,"permalink":669,"heroImage":670,"timeToRead":671},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Freactive-extensions-part1-replacing-events\u002F","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",4,{"title":673,"permalink":674,"heroImage":670,"timeToRead":666},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":676,"permalink":677,"heroImage":670,"timeToRead":482},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":679,"permalink":680,"heroImage":681,"timeToRead":666},"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":683,"permalink":684,"heroImage":685,"timeToRead":666},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":687,"permalink":688,"heroImage":689,"timeToRead":666},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":691,"permalink":692,"heroImage":670,"timeToRead":666},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":694,"permalink":695,"heroImage":696,"timeToRead":482},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":698,"permalink":699,"heroImage":700,"timeToRead":701},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":703,"permalink":704,"heroImage":670,"timeToRead":671},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":706,"permalink":707,"heroImage":661,"timeToRead":701},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":709,"permalink":710,"heroImage":670,"timeToRead":711},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":713,"permalink":714,"heroImage":715,"timeToRead":636},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":717,"permalink":718,"heroImage":719,"timeToRead":711},"Model-View-ViewModel (MVVM) - Part 1 - Overview","\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{"title":721,"permalink":722,"heroImage":719,"timeToRead":671},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable","\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F",{"title":724,"permalink":725,"heroImage":719,"timeToRead":652},"Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F",{"title":727,"permalink":728,"heroImage":729,"timeToRead":666},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":731,"permalink":732,"heroImage":719,"timeToRead":733},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F",12,{"title":735,"permalink":736,"heroImage":700,"timeToRead":671},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":54,"permalink":53,"heroImage":738,"timeToRead":739},"\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":104,"permalink":103,"heroImage":741,"timeToRead":742},"\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":744,"permalink":745,"heroImage":746,"timeToRead":739},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":748,"permalink":749,"heroImage":746,"timeToRead":666},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":751,"permalink":67,"heroImage":738,"timeToRead":652},"Securing the ASP.NET MVC Web.config",{"title":753,"permalink":754,"heroImage":670,"timeToRead":482},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":74,"permalink":73,"heroImage":756,"timeToRead":757},"\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",6,{"title":80,"permalink":79,"heroImage":759,"timeToRead":179},"\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":761,"permalink":762,"heroImage":661,"timeToRead":711},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":110,"permalink":109,"heroImage":764,"timeToRead":765},"\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":39,"permalink":92,"heroImage":643,"timeToRead":652},{"title":98,"permalink":768,"heroImage":769,"timeToRead":671},"\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{"title":771,"permalink":772,"heroImage":773,"timeToRead":671},"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":775,"permalink":776,"heroImage":738,"timeToRead":482},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":778,"permalink":779,"heroImage":780,"timeToRead":739},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":782,"permalink":783,"heroImage":784,"timeToRead":482},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":786,"permalink":787,"heroImage":788,"timeToRead":636},".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":790,"permalink":791,"heroImage":792,"timeToRead":666},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":794,"permalink":795,"heroImage":796,"timeToRead":636},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":798,"permalink":799,"heroImage":800,"timeToRead":482},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":802,"permalink":803,"heroImage":804,"timeToRead":666},"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":806,"permalink":807,"heroImage":804,"timeToRead":671},"Subresource Integrity TagHelper Using ASP.NET Core - Part 2","\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F",{"title":809,"permalink":810,"heroImage":811,"timeToRead":711},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":813,"permalink":814,"heroImage":815,"timeToRead":757},"Azure Active Directory Versus Identity Server","\u002Fazure-active-directory-versus-identity-server\u002F","\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{"title":817,"permalink":818,"heroImage":819,"timeToRead":482},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":821,"permalink":822,"heroImage":823,"timeToRead":652},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":825,"permalink":826,"heroImage":661,"timeToRead":482},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":828,"permalink":829,"heroImage":830,"timeToRead":671},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":832,"permalink":833,"heroImage":834,"timeToRead":739},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":836,"permalink":837,"heroImage":670,"timeToRead":636},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":839,"permalink":840,"heroImage":661,"timeToRead":671},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":842,"permalink":843,"heroImage":844,"timeToRead":701},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":846,"permalink":847,"heroImage":848,"timeToRead":739},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":850,"permalink":851,"heroImage":852,"timeToRead":853},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":855,"permalink":856,"heroImage":857,"timeToRead":671},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":859,"permalink":860,"heroImage":861,"timeToRead":482},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":863,"permalink":864,"heroImage":865,"timeToRead":757},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":867,"permalink":868,"heroImage":869,"timeToRead":482},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":871,"permalink":872,"heroImage":873,"timeToRead":711},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":875,"permalink":876,"heroImage":877,"timeToRead":636},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":879,"permalink":880,"heroImage":877,"timeToRead":666},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":882,"permalink":883,"heroImage":877,"timeToRead":671},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":885,"permalink":886,"heroImage":877,"timeToRead":711},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":888,"permalink":889,"heroImage":890,"timeToRead":671},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":892,"permalink":893,"heroImage":894,"timeToRead":711},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":896,"permalink":897,"heroImage":661,"timeToRead":482},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":899,"permalink":900,"heroImage":901,"timeToRead":482},".NET Boxed","\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":903,"permalink":904,"heroImage":661,"timeToRead":482},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":906,"permalink":907,"heroImage":661,"timeToRead":666},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":909,"permalink":910,"heroImage":661,"timeToRead":636},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":912,"permalink":913,"heroImage":661,"timeToRead":853},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":915,"permalink":916,"heroImage":917,"timeToRead":739},"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":919,"permalink":920,"heroImage":921,"timeToRead":853},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":923,"permalink":924,"heroImage":901,"timeToRead":853},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":926,"permalink":927,"heroImage":877,"timeToRead":636},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":929,"permalink":930,"heroImage":931,"timeToRead":671},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":933,"permalink":934,"heroImage":935,"timeToRead":739},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":937,"permalink":938,"heroImage":661,"timeToRead":666},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":940,"permalink":941,"heroImage":901,"timeToRead":711},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":943,"permalink":944,"heroImage":661,"timeToRead":671},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":946,"permalink":947,"heroImage":948,"timeToRead":739},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":950,"permalink":951,"heroImage":952,"timeToRead":482},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":954,"permalink":955,"heroImage":956,"timeToRead":711},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":958,"permalink":959,"heroImage":960,"timeToRead":711},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":962,"permalink":963,"heroImage":715,"timeToRead":757},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":965,"permalink":966,"heroImage":661,"timeToRead":666},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":968,"permalink":969,"heroImage":970,"timeToRead":971},"Deep Dive into Open Telemetry for .NET","\u002Fdeep-dive-into-open-telemetry-for-net\u002F","\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",10,{"title":973,"permalink":974,"heroImage":970,"timeToRead":666},"Open Telemetry for ASP.NET Core","\u002Fopen-telemetry-for-asp-net-core\u002F",{"title":976,"permalink":977,"heroImage":970,"timeToRead":666},"Exporting Open Telemetry Data to Jaeger","\u002Fexporting-open-telemetry-data-to-jaeger\u002F",{"title":979,"permalink":980,"heroImage":981,"timeToRead":666},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":983,"permalink":984,"heroImage":981,"timeToRead":757},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":986,"permalink":987,"heroImage":988,"timeToRead":671},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":990,"permalink":991,"heroImage":992,"timeToRead":482},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":994,"permalink":995,"heroImage":746,"timeToRead":636},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":997,"permalink":998,"heroImage":999,"timeToRead":666},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":1001,"permalink":1002,"heroImage":661,"timeToRead":666},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":1004,"permalink":1005,"heroImage":970,"timeToRead":671},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core","\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F",{"title":1007,"permalink":1008,"heroImage":1009,"timeToRead":482},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":1011,"permalink":1012,"heroImage":1013,"timeToRead":482},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":1015,"permalink":1016,"heroImage":1017,"timeToRead":671},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"title":1019,"permalink":1020,"heroImage":1021,"timeToRead":636},"AI Gone Rogue","\u002Fai-gone-rogue\u002F","\u002Fimages\u002Fhero\u002FHAL-9000-Prop-1600x900.png",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1023},"\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":1025},"\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":1027},"\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":1029},"\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":1031},"\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":1033},"\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":1035},"\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":1037},"\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":1039},"\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":1041},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1793741994877]