ASP.NET 网页 (Razor) 疑难解答指南

作者 Tom FitzMacken

本文介绍在使用 ASP.NET 网页 (Razor) 和一些建议的解决方案时可能遇到的问题。

软件版本

  • ASP.NET 网页 (Razor) 3

本教程还适用于 ASP.NET 网页 2 和 ASP.NET 网页 1.0。

本主题包含以下各节:

有关一般问题,请参阅 ASP.NET 网页 (Razor) 常见问题解答

运行页面的问题

各种问题可能会阻止 .cshtml.vbhtml 页面正常运行。 本部分列出了常见的错误消息和可能的原因。

HTTP 错误 403 - 禁止访问:拒绝访问

你无权使用提供的凭据查看此目录或页面。

如果服务器未运行正确版本的.NET Framework,则会发生此错误。 确保运行服务器的计算机 (本地或远程) 至少安装了 .NET Framework 4。 此外,请确保应用程序本身配置为运行正确的版本。

如果在 WebMatrix 中工作时在本地看到此问题,请单击“网站”工作区,然后在树视图中单击“设置”。“选择.NET Framework版本”列表中,选择“.NET 4 (集成) ”。 如果已设置此版本,请尝试以管理员身份运行 WebMatrix。

请确保网站的根目录中至少有一个 .cshtml 文件。

如果在 Web 服务器位于远程服务器上时看到此错误,请与服务器管理员联系。 确保服务器已安装 .NET Framework 4 或更高版本。 此外,请确保应用程序在配置为使用该版本的 the.NET Framework 的应用程序池中运行。

如果能够控制服务器,请确保它运行的是正确版本的.NET Framework。 还可以尝试通过运行 aspnet_regiis -iru 命令来修复安装。 (例如,如果在安装.NET Framework后安装 IIS,IIS 将无法正确配置为运行 ASP.NET 页。) 有关详细信息,请参阅 ASP.NET IIS 注册工具 (Aspnet_regiis.exe)

HTTP 错误 403.14 - 禁止访问

Web 服务器配置为不列出此目录的内容。

如果请求 (受保护的资源(如 Web.config 文件) )或位于受保护 ((如 App_DataApp_Code) )的文件夹中,则会发生此错误。

HTTP 错误 404.17 - 未找到

请求的内容显示为脚本,不会由静态文件处理程序提供服务。

如果服务器未正确配置为使用 .NET Framework 4 或更高版本,因此无法识别块中的@{ }代码,则会发生此错误。 请参阅前面有关 HTTP 错误 403 - 禁止访问的说明: 拒绝访问

HTTP 错误 404.7 - 找不到

请求筛选模块配置为拒绝文件扩展名

如果在服务器上显式阻止 .cshtml.vbhtml 扩展,则会发生此错误。 此问题的一个症状是 URL 在不包含扩展时正常工作,但包含 .cshtml.vbhtml 的 URL 不起作用。 一种可能的解决方案是在站点的 Web.config 文件中重新启用扩展。 以下示例演示如何启用 .cshtml 扩展。

<system.webServer>
  <security>
   <requestFiltering>
     <fileExtensions>
       <remove fileExtension=".cshtml" />
       <add fileExtension=".cshtml" allowed="true" />
     </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>

HTTP 错误 404.8 - 找不到

请求筛选模块配置为拒绝 URL 中包含 hiddenSegment 节的路径。

如果请求 (受保护的资源(如 Web.config 文件) )或位于受保护 ((如 App_DataApp_Code) )的文件夹中,则会发生此错误。

(“/”应用程序) 中的服务器错误,不会提供这种类型的页面

请参阅前面有关 HTTP 错误 404.17 的说明。

Razor 代码的问题

名称“class”在当前上下文中不存在

通常,出现此错误 class 的一个原因是引用了帮助程序,但未安装帮助程序。 例如,如果尝试使用帮助程序,但如果尚未从 NuGet 安装包,则会看到此错误。 使用 WebMatrix 中的库查找并安装帮助程序。

如果已安装帮助程序,但页面仍无法识别它,请尝试向代码添加 语句 using 。 在 语句中 using ,引用包含帮助程序的命名空间。 例如,ASP.NET Web 帮助程序包中的基本帮助程序位于 命名空间中 System.Web.Helpers 。 在想要使用帮助程序的页面顶部,添加以下行:

@using Microsoft.Web.Helpers;

安全性和成员身份问题

如果在 ASP.NET 网页 (Razor) 中使用内置安全 (成员身份) 系统,则可能会遇到以下问题。

若要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例

此错误可能指示未配置任何 AspNetSqlMembershipProvider 类。 (一种症状是,站点在本地运行正常,但在将站点发布到托管提供商的服务器时会引发此错误。) 此问题的一个解决方法是通过将以下内容添加到站点 Web.config 文件来显式启用简单的成员身份:

<configuration>

  <!-- other setting -->

  <appSettings>
    <add key="enableSimpleMembership" value="true" />
  </appSettings>

  <!-- other settings -->

</configuration>

发送Email时出现问题

发送电子邮件的问题可能难以调试。 初始问题可能是无法连接到 SMTP 服务器。 如果连接成功,ASP.NET 将邮件交给 SMTP 服务器。 但是,邮件本身可能存在问题,导致 SMTP 服务器无法发送它。

如果应用程序未成功发送电子邮件,请尝试以下操作:

  • SMTP 服务器名称通常类似于 smtp.provider.comsmtp.provider.net。 但是,如果将站点发布到托管提供程序,则此时的 SMTP 服务器名称可能是 localhost。 出现这种情况的原因是,在发布站点并在提供程序的服务器上运行后,从应用程序的角度来看,SMTP 服务器可能是本地服务器。 服务器名称的此更改可能意味着必须在发布过程中更改 SMTP 服务器名称。
  • 端口号通常为 25。 但是,某些提供程序要求使用端口 587 或其他某些端口。 请与 SMTP 服务器的所有者核实他们期望你使用的端口号。
  • 请确保使用正确的凭据。 如果已将网站发布到托管提供商,请使用提供商专门指示的电子邮件凭据。 这些凭据可能与用于发布的凭据不同。
  • 有时根本不需要凭据。 如果你使用个人 ISP 发送电子邮件,则电子邮件提供商可能已经知道你的凭据。 发布后,可能需要使用与在本地计算机上测试时不同的凭据。
  • 如果电子邮件提供商使用加密,请将 设置为 WebMail.EnableSsltrue

如果发送电子邮件时出错,你可能会看到标准 ASP.NET 错误消息,如下所示:

电子邮件出现问题时 ASP.NET 错误消息

还可以使用 try-catch 块来调试发送电子邮件时出现的问题,如以下示例所示。 使用 try-catch 块时,ASP.NET 不显示其标准错误消息。 相反,可以在块的 部分中 catch 捕获错误。

var errorMessage = "";
try {
    // Initialize WebMail helper
    WebMail.SmtpServer = "your-SMTP-server-name";
    WebMail.SmtpPort = 25;   // Or the port you've been told to use
    WebMail.EnableSsl = false;
    WebMail.UserName = "your-login-name";
    WebMail.Password = "your-password";
    WebMail.From = "your-from-address";

    WebMail.Send(to: test-To-address,
        subject: "Test email message",
        body: "This is a debug email message"
    );
}
catch (Exception ex ) {
errorMessage = ex.Message;
}

// Other code or markup here ...

<!-- In markup, add the following -->
@if(!errorMessage.IsEmpty()){
    <p>@errorMessage</p>
}

替换 的相应值,以 your-SMTP-server-name类为 。 你可能会以这种方式看到的一些错误消息包括:

  • 发送邮件失败。

    \- 或 -

    连接尝试失败,因为连接的一段时间后未正确响应,或者建立的连接失败,因为连接的主机无法响应

    此错误通常意味着应用程序无法连接到 SMTP 服务器。 检查服务器名称和端口号。

  • 邮箱不可用。 服务器响应为:5.1.0 <someuser@invaliddomain> 发件人被拒绝:无效的发件人域

    此消息可能指示 From 地址不正确或缺失。

  • 指定的字符串不是电子邮件地址所需的格式。

    此错误可能指示 或 From 属性的值To未识别为电子邮件地址。 (ASP.NET 无法检查电子邮件地址有效,只能使用正确的格式,如 name@domain.com.)

注意

在将页面发布到实时网站之前,删除显示错误 (@errorMessage) 的标记。 让用户看到从服务器获取的错误消息不是一个好主意。

其他资源

ASP.NET 网页 (Razor) 常见问题解答

ASP.NET 网站上的 WebMatrix 和 ASP.NET 网页 论坛