ASP.NET 网页 (Razor) 疑难解答指南
本文介绍在使用 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_Data 或 App_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_Data 或 App_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.com
或smtp.provider.net
。 但是,如果将站点发布到托管提供程序,则此时的 SMTP 服务器名称可能是localhost
。 出现这种情况的原因是,在发布站点并在提供程序的服务器上运行后,从应用程序的角度来看,SMTP 服务器可能是本地服务器。 服务器名称的此更改可能意味着必须在发布过程中更改 SMTP 服务器名称。 - 端口号通常为 25。 但是,某些提供程序要求使用端口 587 或其他某些端口。 请与 SMTP 服务器的所有者核实他们期望你使用的端口号。
- 请确保使用正确的凭据。 如果已将网站发布到托管提供商,请使用提供商专门指示的电子邮件凭据。 这些凭据可能与用于发布的凭据不同。
- 有时根本不需要凭据。 如果你使用个人 ISP 发送电子邮件,则电子邮件提供商可能已经知道你的凭据。 发布后,可能需要使用与在本地计算机上测试时不同的凭据。
- 如果电子邮件提供商使用加密,请将 设置为
WebMail.EnableSsl
true
。
如果发送电子邮件时出错,你可能会看到标准 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
) 的标记。 让用户看到从服务器获取的错误消息不是一个好主意。