/// <summary> /// Gets the name of the filter by CFG. /// </summary> /// <param name="name">The name.</param> /// <returns></returns> public static DownloadFilterBase GetFilterByCfgName(String name) { DownloadFilterSection section = (DownloadFilterSection) ConfigurationManager.GetSection(downloadFiltersCfgName); if (section != null) { DownloadFilterCollection filters = section.Filters; foreach (DownloadFilterElement filter in filters) { if (filter.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)) { //Try to create profile instance Type filterType = AssemblyUtil.LoadType(filter.Type); DownloadFilterBase retVal = (DownloadFilterBase) System.Activator.CreateInstance(filterType); return(retVal); } } } return(null); }
/// <summary> /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler"></see> interface. /// </summary> /// <param name="context">An <see cref="T:System.Web.HttpContext"></see> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param> public void ProcessRequest(HttpContext context) { string libPath = HttpUtility.UrlDecode(context.Request.Url.AbsolutePath); string appPath = context.Request.ApplicationPath; appPath = appPath.TrimEnd(new char[] { '/' }); if (!String.IsNullOrEmpty(appPath)) { libPath = libPath.Substring(appPath.Length + 1); } int index = libPath.LastIndexOf('/'); if (index != -1) { String elemName = libPath.Substring(index + 1); //remove iis extension from element name elemName = elemName.Substring(0, elemName.LastIndexOf('.')); libPath = libPath.Substring(0, index); FolderElement[] elements = FolderElement.GetElementsByPath(libPath); if (elements != null) { foreach (FolderElement element in elements) { /* * if (provider is PublicDiskStorageProvider) * downloadProfile = BaseBlobProfile.GetAccessProfileByCfgName("iis"); * */ if (elemName.Equals(element.Name, StringComparison.InvariantCultureIgnoreCase)) { try { //"open" - is DonwloadProfile in Web.config BaseBlobProfile downloadProfile = BaseBlobProfile.GetAccessProfileByCfgName("open"); //If public disk provider then redirect BlobStorageProvider provider = BlobStorage.Providers[element.BlobStorageProvider]; BlobInfo blobInfo = element.GetBlobInfo(); string profileName = String.Empty; string providerName = String.Empty; if (FolderElement.TryRecognizeStorageProvider(element, blobInfo.FileName, blobInfo.ContentType, blobInfo.ContentSize, out providerName, out profileName)) { if (!String.IsNullOrEmpty(profileName)) { downloadProfile = BaseBlobProfile.GetAccessProfileByCfgName(profileName); } } String filterName = context.Request[FolderElement.filterParam]; //Download filter impl if (!String.IsNullOrEmpty(filterName)) { DownloadFilterBase filter = DownloadFilterBase.GetFilterByCfgName(filterName); if (filter != null) { filter.Initialize(context.Request.Params); //subscribe to filter event downloadProfile.FilterEvent += filter.ProcessFilter; } } //Begin download downloadProfile.ProcessRequest(context, blobInfo); } catch (BlobDownloadException e) { if (e.Code == 204) //No content { context.Response.ClearContent(); context.Response.AddHeader("Content-Length", "0"); } //throw new HttpException(e.Code, e.Message); context.Response.StatusCode = e.Code; context.Response.StatusDescription = e.Message; } } } } } }