web-dev-qa-db-fra.com

En-tête Set-Cookie avec plusieurs cookies

J'ai fait face à un problème.

Lorsque vous ajoutez plusieurs en-têtes Set-Cookie à la réponse

headers.Add("Set-Cookie", "a=b;Path=/;");
headers.Add("Set-Cookie", "c=d;Path=/;");

en fait, ils sont combinés et un seul en-tête est envoyé avec des cookies séparés par des virgules

Set-Cookie: a=b;Path=/;,c=d;Path=/;

Selon RFC2109 c'est une syntaxe valide. Mais ce n'est pas conforme à RFC6265 , ce qui déprécie RFC2109

De plus, les derniers navigateurs ne prennent pas également en charge cette syntaxe séparée par des virgules. Testé sur IE9 , Firefox 13 et Google Chrome 20 .

Tous ces navigateurs ne prenaient que le premier cookie.

Veuillez voir l'exemple de projet ci-dessous

https://github.com/mnaoumov/cookie-bug/

Je veux trouver une solution de contournement.

Je m'attends à avoir deux en-têtes différents Set-Cookie .

J'ai essayé d'écrire certains MessageInspector pour réécrire les en-têtes HTTP. Je n'ai pas pu trouver comment accéder à ces en-têtes.

Des idées?

P.S. Technologie utilisée: API Web

34
mnaoumov

Selon la réponse sur codeplex ( http://aspnetwebstack.codeplex.com/workitem/288 ) ce problème est connu et lié à l'auto-hébergement WCF et devrait être corrigé en passant à IIS hosting.

Il s'agit d'un problème WCF 4 marqué comme ne résoudra pas .

Trouvé une autre question avec le même résultat WCF 4.0 Cookie Only First is Recorded by Browser .

9
mnaoumov

Vous pouvez utiliser HttpContext.Current.Response.SetCookie

using System.Web;


HttpCookie foo = new HttpCookie("foo", "true");
HttpContext.Current.Response.Cookies.Add(foo); 

HttpCookie bar = new HttpCookie("bar", "true");
HttpContext.Current.Response.Cookies.Add(bar);

Cela ajoutera plusieurs en-têtes set-cookies dans la réponse.

Modifier: vous devez également ajouter le

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>

dans votre web.config

1
tom2020