共用方式為


ASP.NET Web Pages (Razor) 疑難排解指南

Tom FitzMacken

本文說明使用 ASP.NET Web Pages (Razor) 時可能會遇到的問題,和一些建議的解決方案。

軟體版本

  • ASP.NET Web Pages (Razor) 3

本教學課程也適用於 ASP.NET Web Pages 2 和 ASP.NET Web Pages 1.0。

本主題包含下列幾節:

針對一般問題,請參閱 ASP.NET Web Pages (Razor) 常見問題集

執行頁面的問題

有各種問題可能會阻止 .cshtml .vbhtml 頁面正常執行。 本節列出常見的錯誤訊息和可能的原因。

HTTP Error 403 - Forbidden: Access is denied

您無權使用所提供的認證來檢視此目錄或頁面。

如果伺服器未執行正確版本的 .NET Framework,就會發生此錯誤。 請確定執行伺服器的電腦 (本機或遠端) 至少已安裝 .NET Framework 4。 也請確定應用程式本身已設定為執行正確的版本。

如果您在 WebMatrix 中工作時在本機看到此問題,請點擊網站工作區,然後在樹狀視圖中點擊設定。 在選取 .NET Framework 版本清單中,選取 .NET 4 (整合)。 如果已設定此版本,請嘗試以系統管理員身分執行 WebMatrix。

請確定網站的根目錄中至少有一個 .cshtml 檔案。

如果您在網頁伺服器位於遠端伺服器上時看到此錯誤,請連絡伺服器管理員。 請確定伺服器已安裝 .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.config 檔案) 或受保護資料夾中的資源 (例如 App_DataApp_Code),就會發生此錯誤。

HTTP Error 404.17 - Not Found

要求的內容似乎是指令碼,靜態檔案處理常式未提供。

如果伺服器未正確設定為使用 .NET Framework 4 或更新版本,因此無法辨識@{ }區塊中的程式碼,就可能發生此錯誤。 請參閱之前 HTTP Error 403 - Forbidden: Access is denied 的描述。

HTTP Error 404.7 - Not Found

要求篩選模組已設定為拒絕檔案擴充

如果伺服器上明確封鎖了 .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 Error 404.8 - Not Found

要求篩選模組已設定為拒絕 URL 中包含 hiddenSegment 區段的路徑。

如果您要求受保護的資源 (例如 Web.config 檔案) 或受保護資料夾中的資源 (例如 App_DataApp_Code),就會發生此錯誤。

未提供這種類型的頁面 ('/' 應用程式中的伺服器錯誤)

請參閱之前 HTTP Error 404.17 的描述。

Razor 程式碼的問題

名稱 '類別' 不存在目前的內容中

通常,您看到此錯誤的原因是class參考協助程式,但未安裝協助程式。 例如,如果您嘗試使用協助程式,但如果您尚未從 NuGet 安裝套件,您會看到此錯誤。 使用 WebMatrix 中的資源庫來尋找並安裝協助程式。

如果已安裝協助程式,但頁面仍然無法辨識,請嘗試新增 using 陳述式至程式碼。 在 using 陳述式中,參考包含協助程式的命名空間。 例如,ASP.NET Web 協助程式套件中的基本協助程式位於System.Web.Helpers命名空間中 。 在您想要使用協助程式的頁面頂端,新增這一行:

@using Microsoft.Web.Helpers;

安全性和成員資格的問題

如果您在 ASP.NET Web Pages (Razor) 中使用內建的安全性 (成員資格) 系統,可能會遇到下列問題。

若要呼叫此方法,「Membership.Provider」屬性必須是「ExtendedMembershipProvider」的執行個體

此錯誤可能表示未設定任何AspNetSqlMembershipProvider類別。 (徵兆是網站在本機正常運作,但當您將此錯誤發佈至主機提供者的伺服器時,會傳回此錯誤。) 此問題的其中一個修正方法是將下列內容新增至網站的 Web.config 檔案,以明確啟用簡單成員資格:

<configuration>

  <!-- other setting -->

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

  <!-- other settings -->

</configuration>

傳送電子郵件的問題

傳送電子郵件的問題可能很難進行偵錯。 初始問題可能是您無法連線到 SMTP 伺服器。 如果連線成功,ASP.NET 會將訊息傳給 SMTP 伺服器。 不過,也有可能是訊息本身有問題,導致 SMTP 伺服器無法傳送它。

如果您的應用程式未成功傳送電子郵件,請嘗試下列動作:

  • SMTP 伺服器名稱通常類似 smtp.provider.comsmtp.provider.net。 不過,如果您將網站發佈至主機提供者,則此時的 SMTP 伺服器名稱可能是 localhost。 這種情況發生的原因是,在您發佈且網站在提供者的伺服器上執行後,SMTP 伺服器可能是從應用程式觀點來看的本機伺服器。 伺服器名稱中的這項變更可能代表您必須在發佈程式時變更 SMTP 伺服器的名稱。
  • 埠號通常是 25。 不過,某些提供者會要求您使用埠 587 或其他埠。 請向 SMTP 伺服器的擁有者確認他們想要您使用的埠號。
  • 請確定您使用正確的認證。 如果您已將網站發佈至主機提供者,請使用提供者已特別指明的認證來傳送電子郵件。 這些認證可能與您用來發佈的認證不同。
  • 有時候您完全不需要認證。 如果您使用個人 ISP 來傳送電子郵件,您的電子郵件提供者可能已經知道您的認證。 發佈之後,您可能需要使用與在本機電腦上測試時不同的認證。
  • 如果您的電子郵件提供者使用加密,請將 WebMail.EnableSsl 設定為 true

如果傳送電子郵件時發生錯誤,您可能會看到標準 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 位址不正確或遺失。

  • 指定的字串不是電子郵件位址所需的格式。

    此錯誤可能代表 To 的值或 From 屬性無法被辨識為電子郵件位址。 (ASP.NET 無法檢查電子郵件位址是否有效,只有其格式正確,例如 name@domain.com。)

注意

將頁面發佈至即時網站之前,請先移除顯示錯誤的標記 (@errorMessage)。 讓使用者看到您從伺服器取得的錯誤訊息不是個好主意。

其他資源

ASP.NET Web Pages (Razor) 常見問題集

ASP.NET 網站上的 WebMatrix 和 ASP.NET Web Pages 論壇