【问题标题】:Why am I getting the Yellow Screen Of Death on an Umbraco SurfaceController on a default/OOTB Umbraco installation?为什么在默认/OOTB Umbraco 安装上的 Umbraco SurfaceController 上出现黄屏死机?
【发布时间】:2016-06-03 17:12:30
【问题描述】:

我的问题是这样的

为了让 Mvc Surface 控制器在 Umbraco 中工作,我错过了哪些配置步骤?

我的理论是,由于默认 Umbraco 安装中有一个名为 /umbraco/ 的文件夹用于连接到 CMS,因此物理路径干扰了路由 /umbraco/surface/{Controller}/{Action},从而导致 ASP.NET YSOD(和一个 IIS 404 当我尝试访问该路由上未定义的控制器时。)


背景信息


我已将此类添加到我的 App_Code 文件夹中,该文件夹位于新下载的 Umbraco 6.1.6 副本中:

public class MembersController : SurfaceController
{
    public ActionResult Index()
    {
        return Content("Hello, Member!");
    }
}

当我导航到我认为应该是我的 Index() 方法的路径时,我收到一个 YSOD,说找不到资源:

代码没有执行,显示上述错误;但是,如果我将 Uri 更改为垃圾,则会收到 IIS 404 错误:

我开始在现有站点中使用它,以为我的站点搞砸了,我在 Umbraco 6.1.6 的新副本中尝试了它,并得到了完全相同的结果。

作为记录,我还尝试了MembersSurfaceController 及其关联的 Uri,其结果与上述完全相同。当我点击有效路由时是 YSOD,当我没有点击时是 IIS 404。

我也将/config/ 目录中的umbracoSettings.config 更改为MVC。


更新


我正在使用开箱即用的 web.config 文件,其中包含:

 <system.webServer>
     <validation validateIntegratedModeConfiguration="false" />
     <modules runAllManagedModulesForAllRequests="true">
         <remove name="UrlRewriteModule" />
         <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
         .
         ..
         ...

在我的默认 Umbraco 网站上,我没有定义任何重写规则;但在我的实际站点上,我有几个重写规则。我认为这不是导致它的原因,因为我在两个网站上都看到了相同的行为......

我已经尝试完全删除 UrlRewrite 我得到了相同的结果。


【问题讨论】:

  • 您是否检查过是否需要 IIS 中的 UrlRewrite 模块?可能值得检查...
  • 我不确定你的意思,我正在运行开箱即用的 web.config。
  • 我可以复制这个问题,但只能通过将我的控制器放在 App_Code 文件夹(Umbraco v6.1.3)中 - 如果它们被遵守,似乎没有问题。这是一个很长的镜头,但是您能否编译控制器(通过添加一个类库,将控制器移动到那里,如果您的项目是一个网站,则将您的网站的引用添加到类库中)然后再试一次?
  • @milquetoastable 我还没有尝试过(我会的),但对于我当前的网站来说,这感觉有点矫枉过正。
  • 编译控制器将解决这个问题,但我想知道您(或其他任何人)是否曾经想过是否可以在 App_Code 文件夹中添加控制器。目前我自己也遇到了同样的问题。创建一个单独的库似乎有些“矫枉过正”。

标签: c# .net asp.net-mvc umbraco


【解决方案1】:

以下方法适用于 Umbraco 7.1,我希望它也适用于 6.1:

在 App_Code 文件夹中创建名为“Controllers”的文件夹,并将表面控制器放入其中(这样它们将位于“Controllers”命名空间中)。

例如我在 App_Code\Controllers 文件夹中有以下控制器(因此,在“控制器”命名空间中):

namespace Controllers
{
    public class ServiceCentersController : SurfaceController
    {
        public ActionResult GetServiceCenters(string country = "", string region = "", string city = "")
        {
        ...
        }
    }
}

我的网站在 localhost 上运行,因此我可以通过导航到以下位置来调用 GetServiceCenters 操作:

http://localhost/umbraco/Surface/ServiceCenters/GetServiceCenters?country=aa&region=bb&city=cc

【讨论】:

  • 为了让我的控制器正常工作,我必须手动将namespace Controllers { .. } 代码添加到我的文件中。文件夹名称似乎无关紧要,只是实际的命名空间。似乎使用网站项目 File=>New 确实插入了命名空间,就像它在 Web 应用程序项目类型中所做的那样。
  • 您是否也在后台创建了任何相关的东西?后台和表面控制器中的数据类型之间是否存在联系?
  • 您不需要在后台进行任何特定设置来创建答案中描述的表面控制器。请注意,通过从 SurfaceController 类继承,您可以访问 Umbraco API,这些 API 提供对由后台指定的数据类型表示的 CMS 数据的访问。
【解决方案2】:

您的控制器需要一个命名空间 - 上面发布的代码没有任何命名空间:

public class MembersController : SurfaceController
{
    public ActionResult Index()
    {
        return Content("Hello, Member!");
    }
}

这就是为什么创建一个 Controllers 的命名空间是可行的......但是你可以把它作为你想要的任何逻辑命名的命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多