仅将 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/html
Content-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
并在JSON、XML等中再次使用相同的服务。您还可以检索部分生成的 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-heavy和REST-Services-light的一种常见方法是将 ServiceStack 托管在/custompath(例如 /api),这样您就可以使用 ASP.NET 生成所有 HTML 页面。
如果改用 ASP.NET MVC,则需要忽略 MVC 的 Global.asax RegisterRoutes()中的路由:
routes.IgnoreRoute ("servicestack/{*pathInfo}");