ServiceStack:存在时从目录提供静态文件吗?

2023-12-13

我正在将我的独立的自制 Web 服务器转换为使用 ServiceStack 来提供所有页面和资源。

从这个问题我看出

使用 servicestack 提供静态文件

使用服务堆栈提供单个静态文件很容易。

在我自己开发的实现中,在检查 URL 是否与任何特定处理程序(相当于 ServiceStack 路由)匹配后,默认处理程序会检查其 HttpData 目录中的静态文件以提供与 URL 匹配的服务。

如果该文件不存在,则会生成 404 错误。

如果没有其他服务匹配,与 ServiceStack 一起使用来从文件系统提供文件的最佳模式是什么?请注意,我在没有 IIS 的情况下以独立模式使用它。

这些文件可以是 HTML、PNG、JS 和少数其他内容类型。

注意:我看到 ServiceStack.Razor 包may协助我的要求,但我找不到相关的文档。我将就此提出一个单独的问题。

Edit: 我在这个问题中找到了参考

使用 ServiceStack 为根路径“/”创建路由

表明

注册一个IAppHost.CatchAllHandlers- 这会因不匹配的请求而被调用。

到目前为止,我还没有找到任何文档或示例how到此注册。注意:我正在独立运行,因此需要使用 C# 完成,而不是使用 XML。


经过大量研究,我发现以下似乎有效。

配置

In the AppHost构造函数:

                CatchAllHandlers.Add(
                    (httpMethod, pathInfo, filePath) => 
                        Tims.Support.StaticFileHandler.Factory(
                            Params.Instance.HttpDataDir, 
                            "/", 
                            pathInfo
                    )
                );

工厂

检查文件是否存在,并返回适当的处理程序,如果不处理文件(因为文件不存在),则返回 null。这很重要,这样其他网址(例如/metadata继续工作。

Handler

实际处理程序的核心方法非常简单。通过覆盖ProcessRequest并返回具有适当资源类型的文件字节,工作就完成了。为简单起见,此版本不包括任何用于缓存目的的数据处理。

示例代码

public class StaticFileHandler : EndpointHandlerBase
{
    protected static readonly Dictionary<string, string> ExtensionContentType;

    protected FileInfo fi;

    static StaticFileHandler()
    {
        ExtensionContentType = new Dictionary<string, string>       (StringComparer.InvariantCultureIgnoreCase) 
        {
            { ".text", "text/plain" },
            { ".js", "text/javascript" },
            { ".css", "text/css" },
            { ".html", "text/html" },
            { ".htm", "text/html" },
            { ".png", "image/png" },
            { ".ico", "image/x-icon" },
            { ".gif", "image/gif" },
            { ".bmp", "image/bmp" },
            { ".jpg", "image/jpeg" }
        };
    }

    public string BaseDirectory { protected set; get; }
    public string Prefix { protected set; get; }

    public StaticFileHandler(string baseDirectory, string prefix) 
    {            
        BaseDirectory = baseDirectory;
        Prefix = prefix;
    }

    private StaticFileHandler(FileInfo fi)
    {
        this.fi = fi;
    }

    public static StaticFileHandler Factory(string baseDirectory, string prefix, string pathInfo)
    {
        if (!pathInfo.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase))
        {
            return null;
        }

        var fn = baseDirectory + "/" + pathInfo.After(prefix.Length);

        var fi = new System.IO.FileInfo(fn);

        if (!fi.Exists)
        {
            return null;
        }

       return new StaticFileHandler(fi);
    }   

    public override void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName)
    {
        using (var source = new System.IO.FileStream(fi.FullName, System.IO.FileMode.Open))
        {
            var bytes = source.ReadAllBytes();
            httpRes.OutputStream.Write(bytes, 0, bytes.Length);
        }

        // timeStamp = fi.LastWriteTime;                        

        httpRes.AddHeader("Date", DateTime.Now.ToString("R"));
        httpRes.AddHeader("Content-Type", ExtensionContentType.Safeget(fi.Extension) ?? "text/plain");                       
    }

    public override object CreateRequest(IHttpRequest request, string operationName)
    {
        return null;
    }

    public override object GetResponse(IHttpRequest httpReq, IHttpResponse httpRes, object request)
    {
        return null;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ServiceStack:存在时从目录提供静态文件吗? 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • Flutter iOS 文件共享 - 无法打开共享文件

    我正在为 iOS 构建一个 flutter 应用程序 我创建了一种文件类型 我的应用程序和另一个应用程序可以来回共享 我正在使用颤振接收共享意图库来实现这一点 为了测试它 我对 info plist 文件进行了所有必要的更改以处理我的自定义
  • 带有 ASP.NET Web 服务的 jQuery AutoComplete (jQuery UI 1.8rc3)

    目前 当从 ashx 处理程序返回 XML 时 我可以使用此版本的自动完成控件 xml 看起来像这样
  • 添加超链接到文本块 WPF

    我在数据库中有一些文本 如下所示 Lorem ipsum dolor sat amet consectetur adipiscing elit 杜伊斯 Tellus nisl venenatis et pharetra ac tempor
  • 如何使用alignof强制堆分配对齐?

    我想强制特定的堆分配返回 64 字节对齐的地址 因为这是缓存行边界 我以为我可以这样做 int p new alignas 64 int 但我的编译器似乎都没有给出p64 的倍数的地址 这是我检查的方法 include
  • 为什么 os.normpath 不折叠前导双斜杠?

    在Unix下 os path normpath将多个斜线折叠成单个斜线除非恰好出现两个斜杠 表明路径的开头 为何例外 为了说明这一点 我得到以下转换 double slash stays gt double slash stays doub
  • 为什么模拟不能与 AsyncTask 一起使用?

    我正在使用 ApplicationTestCase 测试 Android 应用程序 我想模拟我的 AsyncTasks 之一 简化示例以显示问题 public class Foo extends AsyncTask
  • 数据框中单行中的重复值

    df lt data frame label c a b c val c x b c val1 c z b d label val val1 1 a x z 2 b b b 3 c c d 我想找出每一行中的重复值 对于第一行 没有重复的
  • 我的 Java 代码中出现错误,但我看不出它出了什么问题。帮助?

    我收到的错误是在 while 循环中的 fillPayroll 方法中 其中显示 payroll add employee 该错误表明我无法在数组类型 Person 上调用 add 但 Employee 类继承自 Person 所以我认为这
  • 通过python代码附加JSON文件

    我正在尝试创建一个函数 将数据附加到 json 文件中 并遵循已存在的相同缩进 我创建了 json 文件 如下所示 TableA ID 10001 Name Chandan Age 29 ID 10002 Name Rajesh Age 2
  • 谷歌地图 API v3 投影?

    我想知道谷歌地图使用什么投影是 EPSG 4326 还是 P900913 另外 如果您使用绘图工具 会生成什么投影坐标 EPSG3857是官方指定 交互式网络地图使用 球面墨卡托 系统 该系统使用墨卡托投影球体而不是 WGS84 椭球体 更
  • 全屏应用程序 WM6 C#

    谁能指导我如何使用 C 创建适用于 Windows Mobile 6 的全屏应用程序 我正在尝试实现与 Tom Tom 等应用程序类似的显示 其中隐藏了所有操作系统元素 例如开始 任务栏 并且我的应用程序完全填满了屏幕 我正在使用 VS 2
  • 连接到 BLE 设备

    所以我制作了这个应用程序 我可以在其中找到所有具有名称的 BLE 设备 但是我怎样才能使特定字段之一可单击并自动连接到设备 以便我可以开始从中写入 读取呢 Adapter public class ListAdapter BTLE Devi
  • 如何在Spritekit中创建风效果

    我在玩 愤怒的小鸟 到了这个阶段 风 吹 你 有点推你 有点有趣 但我真的无法弄清楚可以完成此操作的逻辑或代码 我知道你可能会使用发射器来创建像 看 一样的风 但我真的很想了解如何完成精灵的 推动 谢谢 你是对的 发射器只能用来产生风在吹的
  • 阅读:hover 伪类与 javascript

    我做了一个函数来覆盖 hover页面上的某些元素 它在正常和正常之间消失 hover 影响 因为我必须创建一个 hover我的 CSS 文件中的类 我觉得这有点不干净 我怎样才能读到 hover伪类内容 Using getComputedS
  • 使用 Cypher 2.0 将 Lucene 查询传递到 Neo4j REST API

    如果我有一个 Lucene 查询 例如 title foo bar AND body baz OR title bat有没有直接的方法可以将其传递到 Cypher 查询中 它看起来像这样用来工作START和旧的node auto index
  • 我可以像数组一样使用 stdClass 吗?

    是否可以使 stdClass 对象像通用索引数组一样工作 IE 数组 数组 0 gt 120 1 gt 382 2 gt 552 3 gt 595 4 gt 616 会被构造成像 a array array 120 array 382 et
  • 手动计算SVM的决策函数

    我正在尝试使用Python库SKLearn手动计算SVC分类器的decision function 而不是使用内置方法 我已经尝试了几种方法 但是 当我don t扩展我的数据 z是一个测试数据 已缩放 我认为其他变量本身就说明了问题 另外
  • 在新 Intent 中显示 TabHost 布局时出现问题

    我在 TabActivity 类型的新 Intent 中使用 TabHost 时遇到问题 希望您能为我指出正确的方向 有趣的是 当我尝试在原始意图中查看它时 它工作正常 setContentView R layout main 我收到 强制
  • 为什么我无法在 HTML 标签内插入注释?

    有什么原因导致我无法在 HTML 标记内插入注释吗 示例 HTML 格式 不可能 img src alt Sample Picture class img circle center block gt 而在 JavaScript 中 这可以
  • ServiceStack:存在时从目录提供静态文件吗?

    我正在将我的独立的自制 Web 服务器转换为使用 ServiceStack 来提供所有页面和资源 从这个问题我看出 使用 servicestack 提供静态文件 使用服务堆栈提供单个静态文件很容易 在我自己开发的实现中 在检查 URL 是否