31

我正在评估 ServiceStack 以在 Windows 服务中用于托管 REST 服务。到目前为止,它非常出色,并且性能优于 WCF。更不用说它更容易使用。

上面提到的 Windows 服务需要能够提供一个简单的 HTML 页面来充当“仪表板”。ServiceStack 当然会用于为仪表板提供 json 数据,但是如何提供仪表板页面以及图像和 js 呢?这可能吗?我宁愿不托管成熟的 ASP.Net,并且严格限制 IIS 永远不会在这些服务器上运行。可扩展性也不应该是一个要求,因为只有一个管理机器会显示仪表板。

4

2 回答 2

55

仅将 ServiceStack 用于 Web 和 Web 服务

ServiceStack 的新 Razor View Engine 支持

ServiceStack.Razor NuGet 包的v3.9.11中添加了对 ServiceStack 的 HTML 故事的重大改进。有了这种支持,ServiceStack 现在可以升级为一个完整的网站和 Web 服务框架,它可以更简单地替代 WCF、MVC 和 WebApi。

Razor Rockstars演示网站中维护了解释 ServiceStack 与 Razor 支持的新 HTML 故事的完整文档:

解释 Razor 支持和描述其功能的完整文档在上面的链接中进行了解释。

只是一个带有 HTML 格式的 REST 服务框架

正如您对真正的 REST 服务框架所期望的那样,HTML Content-Type 已添加到 ServiceStack,即您可以简单地添加 Razor 视图来增强现有服务,这些服务仅在客户端请求text/htmlContent-Type(使用对现有的注册格式没有影响)。例如,这个/rockstars REST 服务仍然可以在所有其他内容类型中访问:

此外,如果您的服务具有该[ClientCanSwapTemplates]属性,客户端可以在运行时交换页面的视图和模板,例如,上面的页面相同:

ServiceStack 以这种方式自然地采用 HTML 格式,使得开发一组可以为 HTML 和丰富的原生移动和桌面客户端提供服务的服务变得轻而易举。

提供 HTML 的其他方式

在添加 Razor 支持之前,有几种使用 ServiceStack 提供 HTML 页面的策略:

使用带有 ajax 调用的静态 html 页面

如果您对现有文件发出 Web 请求,它将通过静态文件处理程序返回。然后,您可以简单地将 ajax json 回调到您的 Web 服务以动态生成页面。

Windows Service AppHost Starter Template中的 TODO Backbone 应用程序就是这样工作的。(以及 ServiceStack 中的大多数其他示例项目 :-)

返回一个字符串

从您的 Web 服务返回的任何字符串都会“按原样”直接写入响应流,因此您可以使用自己的 html 模板解决方案简单地返回 html。

下面列出了 ServiceStack 中其他可能的返回类型以及它们的处理方式。

使用降价剃刀

ServiceStack 中内置的视图引擎是Markdown Razor - 它的灵感来自 MVC 的 Razor,但使用 Markdown 语法。它非常可扩展,支持自定义基类和扩展方法/实用程序。

使用 Markdown Razor 的一个不错的功能是您返回 json、xml 等的相同 Web 服务也可以是在相同 url 处动态生成的 html 页面的视图模型。

这方面的一个示例是类别 Web 服务,您可以在此处查看结果: http ://www.servicestack.net/docs/category/Framework

并在JSONXML等中再次使用相同的服务。您还可以检索部分生成的 html 页面(没有模板)以及动态生成的 markdown

该页面是使用发送到此 MarkdownRazor 视图 https://raw.github.com/ServiceStack/ServiceStack.Examples/master/src/Docs/Views/Category.md的 Web 服务 DTO/视图模型创建的

如果您已为您的 Web 服务指定了 Markdown Razor 页面,它将用于您现在看到的默认HTML5 JSON 报告。

ServiceStack 用于解析用于呈现 HTML 输出的相应 Markdown 模板的解析顺序是:

  • 如果 Web 服务指定了一个模板(通过自定义的 IHttpResult.TemplateName 响应) - 然后是一个具有该名称的视图。
  • 与响应 DTO 同名的视图,首先在 /Views 中查找,然后在 /Views/Shared 中查找
  • 与请求 DTO 同名的视图,首先在 /Views 中查找,然后在 /Views/Shared 中查找

在 /custompath 中托管 ServiceStack

ServiceStack 可以与或不与现有的 ASP.NET Web 应用程序一起使用。如果您的应用程序是HTML-heavyREST-Services-light的一种常见方法是将 ServiceStack 托管在/custompath(例如 /api),这样您就可以使用 ASP.NET 生成所有 HTML 页面。

如果改用 ASP.NET MVC,则需要忽略 MVC 的 Global.asax RegisterRoutes()中的路由:

routes.IgnoreRoute ("servicestack/{*pathInfo}");
于 2011-11-20T07:22:19.570 回答
0

如果您像我一样在具有最新 ServiceStack(5.8.0) 的 .net 核心中尝试使用 ServiceStack.Kestrel 实现自托管红隼,那么提供的答案将不起作用。Razor 包不喜欢这个版本的 ServiceStack,需要 5.0.0 二进制文件。

但是路由页面提供了一个答案: https ://docs.servicestack.net/routing

例子 :


[Route("/hello/world","GET")]
public class HelloWorld{}

public class GreetingService : Service {
     public HttpResult Get(HelloWorld request)
        {
            return new HttpResult(VirtualFileSources.GetFile("HelloWorld.html"));
        }
  }

这花了我很长时间才发现,所以希望这种反应可以减轻某人的痛苦。

请注意,这只允许您返回 html 页面,而不是 Razor 页面,就像所需的原始海报一样。

于 2020-05-10T00:52:15.660 回答