ASP.NET MVC TempData in browser cookie -



ASP.NET MVC TempData in browser cookie -

i trying utilize custom itempdataprovider provider store tempdata in browser's cookie instead of session state. however, works fine except unable remove cookie response stream after reading it.

any ideas? thanks!

public class cookietempdataprovider : itempdataprovider { internal const string tempdatacookiekey = "__controllertempdata"; httpcontextbase _httpcontext; public cookietempdataprovider(httpcontextbase httpcontext) { if (httpcontext == null) { throw new argumentnullexception("httpcontext"); } _httpcontext = httpcontext; } public httpcontextbase httpcontext { { homecoming _httpcontext; } } protected virtual idictionary<string, object> loadtempdata(controllercontext controllercontext) { httpcookie cookie = _httpcontext.request.cookies[tempdatacookiekey]; if (cookie != null && !string.isnullorempty(cookie.value)) { idictionary<string, object> deserializedtempdata = deserializetempdata(cookie.value); // remove cookie cookie.expires = datetime.minvalue; cookie.value = string.empty; _httpcontext.request.cookies.remove(tempdatacookiekey); if (_httpcontext.response != null && _httpcontext.response.cookies != null) { httpcookie responsecookie = _httpcontext.response.cookies[tempdatacookiekey]; if (responsecookie != null) { // remove cookie cookie.expires = datetime.minvalue; cookie.value = string.empty; _httpcontext.response.cookies.remove(tempdatacookiekey); } } homecoming deserializedtempdata; } homecoming new dictionary<string, object>(); } protected virtual void savetempdata(controllercontext controllercontext, idictionary<string, object> values) { string cookievalue = serializetobase64encodedstring(values); var cookie = new httpcookie(tempdatacookiekey); cookie.httponly = true; cookie.value = cookievalue; _httpcontext.response.cookies.add(cookie); } public static idictionary<string, object> deserializetempdata(string base64encodedserializedtempdata) { byte[] bytes = convert.frombase64string(base64encodedserializedtempdata); var memstream = new memorystream(bytes); var binformatter = new binaryformatter(); homecoming binformatter.deserialize(memstream, null) idictionary<string, object> /*tempdatadictionary : returns null*/; } public static string serializetobase64encodedstring(idictionary<string, object> values) { memorystream memstream = new memorystream(); memstream.seek(0, seekorigin.begin); var binformatter = new binaryformatter(); binformatter.serialize(memstream, values); memstream.seek(0, seekorigin.begin); byte[] bytes = memstream.toarray(); homecoming convert.tobase64string(bytes); } idictionary<string, object> itempdataprovider.loadtempdata(controllercontext controllercontext) { homecoming loadtempdata(controllercontext); } void itempdataprovider.savetempdata(controllercontext controllercontext, idictionary<string, object> values) { savetempdata(controllercontext, values); } }

hi had same issue , issue implementation of cookietempdataprovider.

so modified code bit , works perfectly.

when reads info cookie, removes both request , response. add together cookie empty value in savedata function called when request processing completed.

points note : if want remove cookie, have set timeout value , send client , browser remove it. cannot otherwise code cookie handled browser

and found out setting expiration datetime.minvalue not expire cookie in chrome (don't know other browsers) set 2001-01-01 :)

here working code

public class cookietempdataprovider : itempdataprovider { internal const string tempdatacookiekey = "__controllertempdata"; httpcontextbase _httpcontext; public cookietempdataprovider(httpcontextbase httpcontext) { if (httpcontext == null) { throw new argumentnullexception("httpcontext"); } _httpcontext = httpcontext; } public httpcontextbase httpcontext { { homecoming _httpcontext; } } protected virtual idictionary<string, object> loadtempdata(controllercontext controllercontext) { if (_httpcontext.request.cookies.allkeys.contains(tempdatacookiekey)) //we need because //cookies[tempdatacookiekey] create cookie if not exist { httpcookie cookie = _httpcontext.request.cookies[tempdatacookiekey]; if (cookie != null && !string.isnullorempty(cookie.value)) { idictionary<string, object> deserializedtempdata = deserializetempdata(cookie.value); // remove cookie cookie.expires = new datetime(2000, 1, 1); cookie.value = string.empty; _httpcontext.request.cookies.remove(tempdatacookiekey); if (_httpcontext.response != null && _httpcontext.response.cookies != null) { httpcookie responsecookie = _httpcontext.response.cookies[tempdatacookiekey]; if (responsecookie != null) { // remove cookie cookie.expires = new datetime(2000, 1, 1); cookie.value = string.empty; _httpcontext.response.cookies.remove(tempdatacookiekey); } } homecoming deserializedtempdata; } } homecoming new dictionary<string, object>(); } protected virtual void savetempdata(controllercontext controllercontext, idictionary<string, object> values) { if (values != null && values.count > 0) { //there values set, add together cookie. no need expire need browser send //cookie next request string cookievalue = serializetobase64encodedstring(values); var cookie = new httpcookie(tempdatacookiekey); cookie.httponly = true; cookie.value = cookievalue; _httpcontext.response.cookies.add(cookie); } else { //still need add together cookie expiration set, create client browser remove cookie request. //otherwise browser go on send cookie response //also need if requet had tempdata cookie if (_httpcontext.request.cookies.allkeys.contains(tempdatacookiekey)) { { httpcookie cookie = _httpcontext.request.cookies[tempdatacookiekey]; // remove request cookie cookie.expires = new datetime(2000, 1, 1); cookie.value = string.empty; _httpcontext.request.cookies.remove(tempdatacookiekey); var rescookie = new httpcookie(tempdatacookiekey); rescookie.httponly = true; rescookie.value = ""; rescookie.expires = new datetime(2000, 1, 1); //so browser remove cookie when receives request _httpcontext.response.cookies.add(rescookie); } } } } public static idictionary<string, object> deserializetempdata(string base64encodedserializedtempdata) { byte[] bytes = convert.frombase64string(base64encodedserializedtempdata); var memstream = new memorystream(bytes); var binformatter = new binaryformatter(); homecoming binformatter.deserialize(memstream, null) idictionary<string, object> /*tempdatadictionary : returns null*/; } public static string serializetobase64encodedstring(idictionary<string, object> values) { memorystream memstream = new memorystream(); memstream.seek(0, seekorigin.begin); var binformatter = new binaryformatter(); binformatter.serialize(memstream, values); memstream.seek(0, seekorigin.begin); byte[] bytes = memstream.toarray(); homecoming convert.tobase64string(bytes); } idictionary<string, object> itempdataprovider.loadtempdata(controllercontext controllercontext) { homecoming loadtempdata(controllercontext); } void itempdataprovider.savetempdata(controllercontext controllercontext, idictionary<string, object> values) { savetempdata(controllercontext, values); } }

asp.net-mvc-2 cookies tempdata

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -