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

时间:2013-03-06 20:09:37

标签: c# asp.net .net cookies currentculture

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

  1. 生产和开发之间的差异是否足以导致此问题?
  2. 我怎样才能弄清楚生产/开发之间有什么不同?
  3. 我可以做些什么来解决这个问题?
  4. 以下是我用来重现问题的详细信息。我看到的错误是:

    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

    我创建了一个可以重现问题的控制台应用程序(下面的相关部分)。 https://compilr.com/adutton/cookiecutterexample/main.cs

    的完整代码
    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);
    }

    此代码适用于我的开发计算机(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

2 个答案:

答案 0 :(得分:1)

我认为问题出在星期几之后的逗号,如下所示:Help With .NET CookieContainer

答案 1 :(得分:1)

正如@nunzabar指出的那样,问题在于当前文化在星期几中设置逗号。在这种情况下,安装.NET 4.5框架会导致问题消失。我没有反编译代码以查看.NET 4.0和4.5之间的差异,但是当我们安装新版本的框架时,它已得到修复。