4

我想在不使用 MVC 的情况下将 ServiceStack 用作纯 AppHost 实现。我想用它来驱动单页应用程序。

为 SPA 的单个 HTML shell 页面提供服务非常简单,我已经找到了很多这样做的示例。但是,我还需要提供一些 JavaScript 文件,并且我正在评估执行此操作的最佳方式。我可以简单地将脚本标签放在 HTML shell 页面中,但是我没有得到捆绑和缩小的好处,而且每次添加新的 JavaScript 文件时我都必须维护它。

所有这些问题都可以通过捆绑解决方案(例如 Cassette 或 ASP.NET MVC4 Bundles)来解决。但是我将如何将这些与 ServiceStack AppHost 一起使用?

ServiceStack.Bundler 项目很棒,但它似乎依赖于 ASP.NET MVC,例如作为 HTML 助手的基础,它在 HTML 中呈现 JavaScript 标记。

如果可能的话,我希望能够在不依赖 MVC 的情况下做到这一点。

4

3 回答 3

3

如果您还没有看过 GruntJS,那么值得一看 ( http://gruntjs.com/ )。通过创建一些简单的任务,它可以组合和缩小您的 HTML、JS 和 CSS,并且不依赖于 .NET。GruntJS 还有许多其他真正有用的任务(js lint 检查、JS 单元测试运行等等)。您也可以轻松地为您的环境设置不同的任务(即,在部署到开发服务器时不要合并/缩小)。

它允许您创建一个纯静态的 HTML、CSS 和 JS SPA,并且您可以在与 ServiceStack AppHost 完全不同的解决方案/项目中进行管理。

因此,在您的示例中,您只需像往常一样引用 index.html 文件中的脚本,当您准备部署到登台/生产时,您将运行您的 grunt 任务,该任务将为您捆绑/缩小您的代码并将静态 html、min.css 和 min.js 文件输出到某个部署目录。它非常强大和灵活。

我曾经使用过 Bundler,最近我切换到了 GruntJS,我没有回头。

于 2013-06-02T18:11:06.160 回答
2

似乎 Cassette 和 Microsoft.AspNet.Web.Optimization(默认包含在 MVC4 项目中的捆绑解决方案)都不依赖于 ASP.NET MVC。因此,任何一种解决方案都可以与 ServiceStack 的 AppHost 实现一起使用。

对于卡带:

如果从 NuGet 安装,一切正常:

ServiceStack.Host.AspNet

ServiceStack.Razor

盒式磁带

...然后像往常一样使用 Razor 'cshtml' 文件中的 Cassette。

一个小问题确实让我挠了几分钟:

在 web.config 中列出 HttpHandler 的顺序很重要。该包添加了一个使用通配符的 HttpHandler 路径,这意味着永远不会到达ServiceStack.Host.AspNet任何进一步的 HttpHandler,例如 for 。Cassette.axd

只需将我的 web.config 中的顺序更改为:

<httpHandlers>
  <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" />
  <add path="cassette.axd" verb="*" type="Cassette.Aspnet.CassetteHttpHandler, Cassette.Aspnet" />
</httpHandlers>

至:

<httpHandlers>
  <add path="cassette.axd" verb="*" type="Cassette.Aspnet.CassetteHttpHandler, Cassette.Aspnet" />
  <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" />
</httpHandlers>

解决了这个问题。我不知道首先从 Nuget 安装 Cassette.Aspnet 是否会首先防止此问题发生。

对于 Microsoft.AspNet.Web.Optimization:

从 NuGet,您安装:

ServiceStack.Host.AspNet

ServiceStack.Razor

Microsoft.AspNet.Web.Optimization

完成此操作后,您可以正常使用 Microsoft.AspNet.Web.Optimization 捆绑和缩小。

我添加了一个BundleConfig.cs文件,遵循您在默认 MVC4 项目中找到的约定。BundleConfig.RegisterBundles(BundleTable.Bundles);然后我从 ServiceStack AppHost 文件中调用。

此后,@Scripts.Render()Razor 文件中的所有语句都可以正常工作。

于 2013-06-01T08:31:46.530 回答
2

所以,我认为在 ServiceStack 的 AppHost 中需要做任何事情来使用“捆绑和缩小”解决方案。为了简化“捆绑”过程...

1 - 从文件夹中“捆绑”文件创建新文件
2 - 从视图/Html 中引用“捆绑”文件

如何从文件夹“捆绑”文件创建新文件

卡带

  • Cassette 似乎通过调用 CassetteBundleConfiguration 类的 Configure 方法的“一些魔法”(请参阅​​ web.config 修改以获得洞察力)来处理这个过程。安装 Nuget 包会为您完成“设置”。

ServiceStack.Bundler

引用“捆绑”文件

只要您知道文件的路径,您就可以随意执行此操作

<link href="/Content/some.css" rel="stylesheet" type="text/css" />
<script src='some.js'></script>

Cassette 提供了一些方便的渲染功能

@Bundles.Reference('yourbundle')
@Bundles.RenderStylesheets()
@Bundles.RenderScripts()

ServiceStack.Bundler 也提供了一些(我认为这是依赖于 System.Web.MVC 的代码)

@Html.RenderJsBundle()
@Html.RenderCssBundle() 

注意:这些只是写出<link><script>HTML 标签。

于 2013-05-15T22:40:29.020 回答