public class ETagAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Filter = new ETagFilter(filterContext.HttpContext.Response, filterContext.RequestContext.HttpContext.Request); } } public class ETagFilter : MemoryStream { private HttpResponseBase _response = null; private HttpRequestBase _request; private Stream _filter = null; public ETagFilter(HttpResponseBase response, HttpRequestBase request) { _response = response; _request = request; _filter = response.Filter; } private string GetToken(Stream stream) { var checksum = new byte[0]; checksum = MD5.Create().ComputeHash(stream); return Convert.ToBase64String(checksum, 0, checksum.Length); } public override void Write(byte[] buffer, int offset, int count) { var data = new byte[count]; Buffer.BlockCopy(buffer, offset, data, 0, count); var token = GetToken(new MemoryStream(data)); var clientToken = _request.Headers["If-None-Match"]; if (token != clientToken) { _response.AddHeader("ETag", token); _filter.Write(data, 0, count); } else { _response.SuppressContent = true; _response.StatusCode = 304; _response.StatusDescription = "Not Modified"; _response.AddHeader("Content-Length", "0"); } } }
انتخاب معماری مناسب برای توسعه یک پروژه و انتخاب و تفکیک دقیق لایهها همیشه یکی از مهمترین دغدغههای برنامه نویسان است، خصوصا اینکه طراحی بد ساختار یک پروژه در ادامه میتواند سردرگمی فراوانی را بوجود بیاورد و سرعت توسعه و امکان افزودن قابلیتهای جدید را بسیار دشوار کند.
در این مقاله یک مثال ساده اما سراست از معماری مناسب برای پروژههای MVC معرفی شده است. البته بدیهی است این فقط یک پیشنهاد خوب است و دارای کاستی هایی نیز هست.
Windows Authentication در Asp.Net و رفتار های جالب Active Directory
301, MovedPermanently