ServiceStack Razor视图未编译

本文关键字:编译 视图 Razor ServiceStack | 更新日期: 2023-09-27 18:25:51

我已经在自托管服务中成功地实现了Razor Viewpages,在更新到3.9.56之前,页面呈现得很完美。这些视图在windows窗体应用程序和windows窗体客户端中进行了测试,该客户端将使用来自该服务的json响应。这仍然非常有效,但现在当我测试Razor视图时,我在请求页面时不断收到以下异常:

ERROR: Error occured while Processing Request: [HttpCompileException] c:'Users'Cornel'AppData'Local'Temp'2msjdedu.0.cs(24): error CS0246: The type or namespace name 'ViewPage' could not be found (are you missing a using directive or an assembly reference?), Exception: c:'Users'Cornel'AppData'Local'Temp'2msjdedu.0.cs(24): error CS0246: The type or namespace name 'ViewPage' could not be found (are you missing a using directive or an assembly reference?)

我构建了一个小型控制台应用程序来托管服务,Razor视图和页面能够正确呈现。两个项目都有相同的引用,除了测试框架上的Windows窗体程序集引用。两个项目都在单独的程序集中从同一管理类启动AppHost,并且所有视图都已发布。

配置文件中唯一的区别是Windows窗体测试框架上的<userSettings>部分。

[编辑]

当我将@inherits-ViewPage更改为@inherits ServiceStack.Razor.ViewPage时,所有内容都按预期工作

ServiceStack Razor视图未编译

这个问题让我抓狂。我刚刚找到了解决方案:ServiceStack.Razor应用程序的app.config包含这样一个部分:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="ServiceStack.Razor.ViewPage">
      <namespaces>
        <add namespace="System.Linq" />
        <add namespace="ServiceStack.Html" />
        <add namespace="ServiceStack.Razor" />
        <add namespace="ServiceStack.Text" />
        <add namespace="ServiceStack.OrmLite" />
        <add namespace="MyApp" />
        <add namespace="MyApp.Services" />
     </namespaces>
   </pages>
</system.web.webPages.razor>

这些是所有Razor模板的默认命名空间导入。当应用程序位于一个单独的DLL中时,就会出现问题,就像您的示例中的情况一样。假设您有一个名为MyApp.Host的控制台应用程序项目,它引用了MyApp。ServiceStack不是在MyApp.Host.exe.config中查找默认导入,而是在包含AppHost的DLL的配置文件中查找它们,在本例中为MyApp.dll.config。问题是,在构建时,该配置文件不会自动复制到MyApp.Host的bin文件夹中。

解决方案相对简单:在MyApp.Host的构建后事件中添加类似以下内容:

copy /y $(SolutionDir)MyApp'app.config $(TargetDir)MyApp.dll.config

编辑:您也可以通过编程方式添加导入(请参阅在ServiceStack Razor视图中获取HttpCompileException(自托管)):

EndpointHostConfig.RazorNamespaces.Add("ServiceStack.Razor");
EndpointHostConfig.RazorNamespaces.Add("MyApp");
EndpointHostConfig.RazorNamespaces.Add("MyApp.Services");
SetConfig(new EndpointHostConfig
{
    DefaultRedirectPath = "/Home",
});