HttpCookie 路径是否区分大小写?

Is HttpCookie path case sensitive?

这是 C# ASP.NET MVC 5 网络应用程序,使用 .NET Framework 4.6.1。

System.Web.HttpCookie 有一个 Path 属性,即“与 cookie 一起传输的虚拟路径”。默认值“/”表示服务器根目录。

该路径区分大小写吗?我认为它应该是 不区分大小写,因为 URL 的路径部分是不区分大小写的。 [更新:我的这个假设是错误的。请在下面查看答案。] 然而,我的经验证明情况并非如此。

获取 cookie

Web 应用程序有一个 FooBarController,它有一个 index() 方法,我可以在其中获取 cookie 的值,然后呈现视图。

using System.Web;
using System.Web.Mvc;

public class FooBarController : Controller
{
  public ActionResult index( )
  {
    HttpCookie cookie = HttpContext.Request.Cookies.Get( "page_length" );
    if ( cookie != null )
    {
      // Do something with the page length provided by cookie.Value.
      ...
    }

    ...

    return View( somedata );
  }

  ...

以下是该控制器方法的路由。请注意,在路由中使用“foobar”或“FooBar”并不重要。我都试过了。

public class RouteConfig
{
  public static void RegisterRoutes( RouteCollection routes )
  {
    routes.MapRoute( "", "foobar/index", defaults: new { controller = "foobar", action = "index" } );
    routes.MapRoute( "", "foobar/load", defaults: new { controller = "foobar", action = "load", HttpVerbs = HttpVerbs.Post } );
  }
}

存储 cookie

在该控制器的另一种方法中,我将值存储在 cookie 中。假定以下 load() 方法在 Web 应用程序的生命周期内被正确调用,并且 cookie 被正确存储在客户端浏览器中。

  public JsonResult load( TableData data )
  {
     HttpCookie cookie = new HttpCookie( "page_length" );
     cookie.Value = data.PageLength.ToString();

     // *** This is the important part. ***
     cookie.Path = "/FooBar";

     cookie.Expires = DateTime.Now.AddDays( 30 );
     HttpContext.Response.Cookies.Add( cookie );

     ...
  }

测试 1:区分大小写的路径:有效

如前所述,cookie已成功存储在客户端浏览器中。

我启动网络应用程序,然后导航到以下 URL。观察 URL 包含大小写混合的“FooBar”,即使它不一定要到达所需的页面。

FooBarController.index()中,我可以成功获取cookie并使用它的值。

测试 2:不区分大小写的路径:不起作用

cookie 仍然成功存储在客户端浏览器中。

我启动了网络应用程序,但导航到以下 URL。观察 URL 包含一个小写的“foobar”,这足以到达所需的页面。

FooBarController.index()中,我无法获取cookie。该 cookie 对该方法是隐藏的,大概是因为它仅与“/FooBar”的混合大小写路径相关联。

测试 3:缓解

使用“/foobar”的小写路径存储cookie。

  public JsonResult load( TableData data )
  {
     HttpCookie cookie = new HttpCookie( "page_length" );
     cookie.Value = data.PageLength.ToString();

     // *** This is the important part. ***
     cookie.Path = "/foobar";

     ...

我启动网络应用程序,然后导航到以下 URL,与测试 2 相同。

FooBarController.index()中,我可以成功获取cookie并使用它的值。

为什么?

为什么 cookie 的路径必须与正在导航的页面的 URL 的路径部分大小写相同?

是的,HttpCookie 的路径区分大小写。

正如评论中所指出的,我假设 URL 的路径部分不区分大小写是错误的。因此,cookie中存储的路径应该区分大小写是合理的。

C# ASP.NET Web 应用程序的路由配置更为宽容。调用 RouteCollection.MapRoute() 时,提供的 URL 模式可能与用于导航的实际 URL 的大小写不同。提供给 MapRoute() 的控制器和操作名称也可以与实际控制器 class 名称和方法名称的大小写不同。因此,我被误导了。

https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-components-url 说:

The scheme and host components of a URL are not defined as case-sensitive, but the path and query string are case-sensitive. Typically, the whole URL is specified in lowercase.

我发现的大多数其他 URL 文档可能会明确说明其他部分(例如方案和主机)不区分大小写。而且由于它没有说明路径部分的大小写,我应该推断它是区分大小写的。