Cómo configurar una cookie en WCF y leerla en la función de éxito de Ajax que llama (o en otro lugar)

Tengo algunos jQuery JavaScript llamando a un simple servicio web WCF. Es bastante fácil para mí configurar una cookie en JavaScript y leerla desde el lado del servidor.

Aquí está ese código.

Lado del cliente (JavaScript):

document.cookie = "father=christmas"; 

Lado del servidor (C # en WCF):

 var cookieHeader = WebOperationContext.Current.IncomingRequest.Headers[System.Net.HttpRequestHeader.Cookie]; if (!String.IsNullOrEmpty(cookieHeader)) { var match = cookieHeader.Split(';').Select(cookie => cookie.Split('=')).FirstOrDefault(kvp => kvp[0] == "father"); if (match != null) { result = match[1]; // result now equals "christmas" } } 

Pero también me gustaría establecer una cookie en el WCF en el servidor y leerlo en el cliente. Aquí está mi código que no puede hacer eso.

Lado del servidor (C # en WCF):

 WebOperationContext.Current.OutgoingResponse.Headers[System.Net.HttpResponseHeader.SetCookie] = "cloud=lonely"; 

Lado del cliente (jQuery JavaScript):

 $(document).ready(function () { $.ajax({ url: "/ScratchpadSite/Service.svc/Hallo", type: "POST", success: function (data, textStatus, jqXHR) { var xrh = jqXHR.getAllResponseHeaders(); $('body').html('

Father ' + data.d + ''); }, error: function (jqXHR, textStatus, errorThrown) { $('body').html('

' + textStatus + ': ' + errorThrown + ''); } }); });

Sin embargo, el valor de xhr (la variable que esperaba que contenga mi cookie ‘nube = solitaria’) es

 Servidor: servidor de desarrollo ASP.NET / 10.0.0.0
 Fecha: miércoles, 04 de abril 2012 15:29:27 GMT
 Versión X-AspNet: 4.0.30319
 Contenido-Longitud: 17
 Cache-Control: privado
 Tipo de contenido: aplicación / json;  conjunto de caracteres = utf-8
 Conexión: Cerrar

(NB: Mis páginas web (incluido JavaScript) y el servicio WCF residen en el mismo servidor, por lo que no debería haber problemas entre dominios).

¿Estoy configurando correctamente la cookie del encabezado de respuesta? Si es así, ¿dónde debería buscar el valor para el cliente? Si no, ¿cómo debería estar haciendo esto?

Espero que esta no sea la respuesta, pero hay comentarios interesantes sobre esta pregunta . Jfriend00 señala que de acuerdo con esta especificación de W3, getAllResponseHeaders () devolverá todos los encabezados excepto el encabezado Set-Cookie. Y Dan Tao explica que aunque el navegador copiará (¿podría?) La información de la cookie una vez que el navegador procesa la respuesta, eso no sucede hasta después de que se hayan llamado las devoluciones de llamada! Dan sugiere “algún tipo de acuerdo setTimeout en la callback completa”.

Otra opción posible (que no he probado) sugerida por Drew Marsh en los comentarios a su respuesta a “WCF -> ASMX and Cookies” es usar un inspector de mensajes en el código de WCF.

Me resisto a establecer un tiempo de espera (parece un truco) y me resulta más difícil seguir el código WCF con parte de la lógica de los inspectores de mensajes, así que mientras espero otra respuesta, escribiré en el encabezado de la respuesta (en lugar de una cookie) en el código WCF como este:

 WebOperationContext.Current.OutgoingResponse.Headers.Add("cloud", "lonely"); 

y luego léalo en el manejador de JavaScript / jQuery / Ajax complete y escríbalo en una cookie, así:

 $(document).ready(function () { $.ajax({ url: "/ScratchpadSite/Service.svc/Hallo", type: "POST", success: function (data, textStatus, jqXHR) { $('body').html('

Father ' + data.d + '<\/p>'); }, error: function (jqXHR, textStatus, errorThrown) { $('body').html('

' + textStatus + ': ' + errorThrown + '<\/p>'); }, complete: function (jqXHR, textStatus) { var cloudsFeeling = jqXHR.getResponseHeader("cloud"); if (cloudsFeeling) { document.cookie = "cloud=" + cloudsFeeling; } }, }); });

Me siento incómodo al utilizar HTTPResponseHeader en lugar de las cookies, que pensé que estaban diseñadas para este uso, así que por favor sugiera una respuesta mejor.

Puede tratar las cookies de una manera muy inteligente utilizando el complemento $ .cookie que le permite crear, escribir y eliminar cookies.

Esperando que te ayude ..

Todas las cookies establecidas anteriormente por el mismo dominio al que está enviando la solicitud HTTP deben enviarse automáticamente dentro de su solicitud, es decir, todas las cookies se envían automáticamente dentro de la solicitud HTTP, de modo que el dominio al que se dirige la solicitud HTTP se configuró antes. . en respuesta, si desea establecer una cookie en el cliente, puede agregar el encabezado de respuesta denominado “Set-Cookie”