6

我已经在自托管服务中成功实现了 Razor Viewpages,页面呈现完美,直到我更新到 3.9.56。这些视图在一个 Windows 窗体应用程序以及一个使用来自服务的 json 响应的 Windows 窗体客户端中进行了测试。这仍然可以完美运行,但是现在当我测试 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,并且所有视图都已发布。

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

[编辑]

当我将 @inherits ViewPage 更改为 @inherits ServiceStack.Razor.ViewPage 时,一切都按预期工作

4

1 回答 1

5

这个问题快把我逼疯了。我刚刚找到了解决方案:app.configServiceStack.Razor 应用程序包含这样的部分:

<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 文件夹中。

解决方案比较简单:在 的 post build events 中添加类似如下的内容MyApp.Host

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

编辑:您还可以以编程方式添加导入(请参阅Getting a HttpCompileException in ServiceStack Razor view (Self hosting)):

EndpointHostConfig.RazorNamespaces.Add("ServiceStack.Razor");
EndpointHostConfig.RazorNamespaces.Add("MyApp");
EndpointHostConfig.RazorNamespaces.Add("MyApp.Services");
SetConfig(new EndpointHostConfig
{
    DefaultRedirectPath = "/Home",
});
于 2013-10-27T14:56:05.987 回答