internal override Task ResolveView(ResolveViewArgs resolveViewArgs) { if (resolveViewArgs.Success == true) { return(Task.CompletedTask); } var path = new[] { resolveViewArgs.Name } .SelectMany(pattern => ViewExtensions.Select(ext => $"{pattern}{ext}")) .SelectMany(pattern => SearchPaths.Select(searchPath => CombineAndRestrictPath(searchPath, pattern))) .Where(_ => File.Exists(_)) .FirstOrDefault(); if (path == null) { return(Task.CompletedTask); } if (RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) == false) { mimeType = DefaultMimeType; } resolveViewArgs.MimeType = mimeType; resolveViewArgs.LastModified = File.GetLastWriteTimeUtc(path); resolveViewArgs.GetStream = () => Task.FromResult <Stream>(File.OpenRead(path)); resolveViewArgs.Success = true; return(Task.CompletedTask); }
public SimpleFunctionalViewOptions <TContext, TRequest, TResponse> FileAsync(Func <string, Task <string> > resolver) { AsyncViewResolvers.Add(async args => { if (args.Success == true) { return; } var path = await resolver(args.Name); args.MimeType = RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) ? mimeType : DefaultMimeType; args.GetStream = () => Task.FromResult <Stream>(System.IO.File.OpenRead(path)); args.Success = true; }); return(this); }
internal override Task ResolveView(ResolveViewArgs resolveViewArgs) { if (resolveViewArgs.Success == true) { return(Task.CompletedTask); } // build list of path patterns. var name = resolveViewArgs.Name.Replace('/', '.').Replace('\\', '.'); var paths = ViewExtensions.Select(ext => $"{name}{ext}"); foreach (var search in SearchPaths.SelectMany(_ => _.Prefixes.Select(prefix => new { prefix = prefix, assembly = _.Assembly }))) { // search every path pattern. foreach (var path in paths) { var absolutePath = string.IsNullOrWhiteSpace(search.prefix) ? path : $"{search.prefix.TrimEnd('.')}.{path}"; var info = search.assembly.GetManifestResourceInfo(absolutePath); if (info == null) { continue; } // resolve mime type. if (RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) == false) { mimeType = DefaultMimeType; } // construct response. resolveViewArgs.MimeType = mimeType; resolveViewArgs.LastModified = DateTime.MinValue; // embedded resources will not ever change. resolveViewArgs.GetStream = () => Task.FromResult(search.assembly.GetManifestResourceStream(absolutePath)); resolveViewArgs.Success = true; return(Task.CompletedTask); } } // no matches. return(Task.CompletedTask); }