Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }