C# .NET CookieException“;Cookie格式错误“;当线程文化不是英语时-仅在某些环境中

C# .NET CookieException“;Cookie格式错误“;当线程文化不是英语时-仅在某些环境中,c#,asp.net,.net,cookies,currentculture,C#,Asp.net,.net,Cookies,Currentculture,我正在尝试在调用其他web服务的ASP.NET应用程序中执行一些cookie管理。我遇到了一个错误,我只能在某些环境中重现。我的问题是: 生产和发展之间的差异是否足以导致这一问题 我如何找出生产/开发之间的区别 我能做些什么来解决这个问题 下面是我用来重现问题的细节。我看到的错误是: Unhandled Exception: System.Net.CookieException: An error occurred when parsing the Cookie header for Uri

我正在尝试在调用其他web服务的ASP.NET应用程序中执行一些cookie管理。我遇到了一个错误,我只能在某些环境中重现。我的问题是:

  • 生产和发展之间的差异是否足以导致这一问题
  • 我如何找出生产/开发之间的区别
  • 我能做些什么来解决这个问题
  • 下面是我用来重现问题的细节。我看到的错误是:

    Unhandled Exception: System.Net.CookieException: 
    An error occurred when parsing the Cookie header for Uri 'http://example.com/'. 
    ---> System.Net.CookieException: Cookie format error.
       at System.Net.CookieContainer.CookieCutter(Uri uri, String headerName, 
             String setCookieHeader, Boolean isThrow)
       --- End of inner exception stack trace ---
       at System.Net.CookieContainer.CookieCutter(Uri uri, String headerName, 
             String setCookieHeader, Boolean isThrow)
       at System.Net.CookieContainer.SetCookies(Uri uri, String cookieHeader)
       at Program.Main() in c:\Sample\Program.cs:line 21
    此代码在我的开发计算机(Windows 7、x64、.NET 4.5.50709)上运行,但不在生产中(Windows Server 2008 R2 Enterprise,x64、.NET 4.0.30319),其中代码会引发
    es MX
    区域性的异常


    如果我从cookie头中删除日期,异常就会消失,这使我相信这是cookie解析器的本地化问题。也许这是在.NET 4.0->4.5中修复的?

    我相信问题在于星期几之后的逗号,如图所示:

    正如@nunzabar指出的,问题在于当前文化在星期几设置逗号的方式。在本例中,安装.NET4.5框架导致问题消失。我没有对代码进行反编译以查看.NET4.0和4.5之间的差异,但在我们安装新版本的框架时,它已被修复

    string[] cultures = new[] { "en-US", "es-MX" };
    const string cookieHeader = ".ASPXAUTH=SECURITYINFO; domain=.example.com; "
        + "expires=Mon, 06-Mar-2023 18:36:33 GMT; path=/; HttpOnly";
    
    foreach (string culture in cultures)
    {
        Console.WriteLine("CookieCutting with culture: " + culture);
        Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
    
        CookieContainer ctr = new CookieContainer();
        // The following line throws an exception
        ctr.SetCookies(new Uri("http://example.com/"), cookieHeader);
    }