簡體   English   中英

在 IIS 7.5 中托管的 Web Api 中找不到 HTTP 404 頁面

[英]HTTP 404 Page Not Found in Web Api hosted in IIS 7.5

我有一個 Web Api 應用程序。 當我使用 VS 2010 調試開發服務器對其進行測試時,它運行良好。 但是我現在將它部署到 IIS 7.5 並且在嘗試訪問應用程序時出現 HTTP 404 錯誤。

這是我的 web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-FlowGearProxy-20123141219;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="true" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
</configuration>

我也為此苦苦掙扎。 幸運的是,Steve Michelotti 在這里記錄了一個對我有用的解決方案。

在一天結束時,我在 Web 配置中為 ExtensionlessUrlHandler-Integrated-4.0 處理程序啟用了所有動詞(動詞 =“*”)。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
</system.webServer>

其他人指出啟用 WebDAV 會導致問題。 幸運的是,我也沒有遇到這個問題。

有同樣的問題。 此配置設置解決了該問題。

<system.webServer>
    .....
    <modules runAllManagedModulesForAllRequests="true" />
    .....
</system.webServer>

http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html 中所述,應避免使用上述解決方案。 改用這個。 Lopside 也提供了相同的解決方案。 將其保留在這里是為了讓用戶避免實施第一個可行的解決方案。

<modules>
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  <!-- any other modules you want to run in MVC e.g. FormsAuthentication, Roles etc. -->
</modules>

如果在 ASP.NET 之后安裝或啟用了 IIS,您將需要手動向 IIS 注冊 ASP.NET,以便您的 .NET 應用程序工作。

對於 Windows 7 及更早版本:

  1. 以管理員身份運行命令提示符 (cmd.exe)。
  2. 導航到相應的 .NET Framework 位置。 (例如 C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319)
  3. 運行aspnet_regiis.exe -i

對於 Windows 8 及更高版本:

  1. 從開始菜單中,鍵入“打開或關閉 Windows 功能”並選擇第一個結果。
  2. 展開 Internet 信息服務:萬維網服務:應用程序開發功能並選擇 ASP.NET 4.5(如果需要支持 .NET Framework 2.0-3.5 上的項目,則選擇 ASP.NET 3.5)。
  3. 單擊確定。

您是在虛擬目錄還是應用程序中運行 Web API 應用程序?

例如:當我將項目移動到默認網站 > SampleWebAPI 下的本地 IIS 時,我遇到了同樣的問題。 我相信這是由於URL路由的變化如下:

原文: localhost:3092/api/values
移動: localhost/SampleWebAPI/api/values

如果您將 Web API 項目移動到它自己在不同端口上運行的網站,它似乎可以工作。

附加說明:我通過在我的網站中添加api作為應用程序的別名使問題進一步復雜化,這導致有效URL為:

localhost:81/api/api/values - 將網站移至自己的網站后注意到這一點

因此,因為我想保持我的網站和 web api mvc 項目站點之間的分離,我將global.asax中 Web API“DefaultAPI”的路由規則從api/{controller}/{id}更改為{controller}/{id}和 ASP.NET MVC 一個Default{controller}/{id}info/{controller}/{id}

這是唯一對我有用的答案......

我有一個類似的問題......似乎無論我做什么,都沒有重定向,我的全局文件只是被忽略了。 在找到這個答案之前,我認真考慮過結束這一切。 我希望這個鏈接可以幫助其他人。


將以下內容添加到 web.config 文件對我有用:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

system.webServer標簽當然已經存在,但我添加了模塊標簽,然后刪除添加標簽到模塊標簽。

需要檢查的幾件事:

  1. 確保您已安裝 .NET Framework 4。
  2. 確保為您的網站和虛擬目錄(如果適用)選擇了 .NET Framework 版本 4。
  3. 確保您已安裝 MVC 或在您的 bin 目錄中有適當的 DLL。
  4. 可能需要允許 ASP.NET 4.0 Web 服務擴展
  5. 將應用程序放在它自己的應用程序池中。
  6. 確保目錄至少具有“僅腳本”執行權限。

我有一個類似的問題。 我在 web.config 文件中有正確的設置,但在經典模式而不是集成模式下運行應用程序池

截屏

由於以下原因也可能發生此問題

1.在Web.Config中

<system.webServer>
     <modules runAllManagedModulesForAllRequests="true" /> 
<system.webServer>

2.確保部署Web API的服務器上的bin文件夾中有以下內容

  • 系統.Net.Http

  • System.Net.Http.Formatting

  • 系統.Web.Http.WebHost

  • 系統.Web.Http

如果通過 Visual Studio 發布,則默認情況下不會將這些程序集復制到 bin 文件夾中,因為 Web API 包是通過開發計算機中的 Nuget 安裝的。 盡管如此,如果您想讓這些文件作為 Visual Studio 發布的一部分可用,那么您需要將這些程序集的 CopyLocal 設置為 True

薩迪什·庫馬爾.V

基於這個SO answer ,我只需要更改path="*." 在我的web.config中的configuration>system.WebServer>handlers中添加ExtensionlessUrlHandler-Integrated-4.0path="*"

前:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

后:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

我也遇到了這個問題。 我通過轉到應用程序池 > 應用程序池名稱解決了這個問題,並將 .NET Framework 從版本 v.2.0.50727 更改為 v4.0.30319。

我不得不禁用文件發布選項“發布期間預編譯”。

微軟有官方修復: http : //support.microsoft.com/kb/980368

我強烈不推薦使用 < modules runAllManagedModulesForAllRequests="true">。 這導致所有請求(甚至 .jpg、.css、.pdf 等)都將由所有已注冊的 HTTP 模塊處理。 有兩個負面時刻:a) 額外的硬件資源負載; b) 潛在錯誤,因為 http 模塊將處理新類型的內容。

在遵循 Windows Azure 教程后,我開始從 Web API 獲得 404 響應,該教程告訴我將文件“WebRole.cs”添加到我的項目中。

從我的項目中刪除“WebRole.cs”后,我的 Web API 調用又開始工作了。

請確保應用程序池處於集成模式
並將以下內容添加到 web.config 文件中:

<system.webServer>
    .....
    <modules runAllManagedModulesForAllRequests="true" />
    .....
</system.webServer>

就我而言,問題只是我試圖訪問該網站

myserver.myintranet.com/mysite

但是 IIS 中 http 的網站綁定沒有在綁定中指定的主機名。 它以前有效,我不知道它是如何被吹走的。

一旦我將myserver.myintranet.com放入主機名,404 就消失了。

在 IIS 管理器中,您進入操作窗格中的綁定... ,然后編輯 http 綁定以指定主機名。

不要忘記部署 global.asax

有同樣的問題,當從 IIS 提供服務時,web api 控制器的 404 響應,但在 VS2010 中一切正常。 以上解決方案都不適合我。 最終我發現問題在於我們為應用程序添加了 WSE 3.0 支持,而應用程序的 /bin 目錄中缺少 Microsoft.Web.Services3 dll。 奇怪,但是復制dll后,路由映射開始工作。

我也為此苦苦掙扎。 我的確切問題是我有一個 ASMX Web 服務,當我在一個 Web 方法中輸入一個參數並對其進行測試時,它會給我 404。特定的方法在過去運行良好並且沒有改變,只能重新發布。 然后我到了這里並嘗試了所有發布的答案,但沒有任何幫助。

我的終極解決方案? 我知道這很嚴重,但我剛剛創建了一個新的 Visual Studio 解決方案和 Web 項目。 選擇MVC,然后我做了一個“添加”>“新項目”,在它下面選擇了“Visual C#”>“Web”和“Web Service (ASMX)”。 我復制了所有舊的代碼隱藏代碼,然后記下它在新項目中為新文件提供的命名空間,然后將所有舊代碼粘貼到新項目中的新代碼隱藏文件中並放置命名空間回到原來的樣子。

然后,我在使用 Visual Studio 執行“添加”>“新建文件夾”之前的項目中創建了我的文件夾,然后使用 Windows 資源管理器將我的文件復制回其他項目的文件夾中,然后右鍵單擊其中的每個文件夾Visual Studio 並執行“添加”>“現有項目...”並將這些文件夾中的項目拉入我的新項目的 Visual Studio 文件夾中。 我再次引用了我所有的 .NET 程序集,打開了兩個項目,這樣我就可以比較我之前引用的那些(有幾個)。 我不得不為我的新項目命名略有不同——例如,基本上我做了一些類似於“GeneralWebApp”而不是“MyWebApp”的事情——所以我不得不在我的整個解決方案中做一個“全部替換”來替換那個名稱,所以它會為我的所有文件獲取正確的命名空間。

然后我對項目進行了“全部重建”,然后使用 Visual Studio 在正確構建時提供的“播放”按鈕啟動它。 它工作得很好。 所以我發布了它,當我從那里運行它時,我發布它的服務器上的一切都很好。 我無法解釋發生了什么,但我就是這樣度過的。 這不是一個糟糕的測試,只是為了看看 Visual Studio 正在做的事情是否把它搞砸了。

對我來說,問題是根站點配置為使用 .NET 2.0 應用程序池,而我在該站點中的應用程序是 .NET 4.5。

我創建了一個帶有 .NET 4 應用程序池的新站點,並將我的應用程序放置在它的根目錄下 - 效果很好。

如果只將bin文件夾放在IIS中(建好工程后),也會出現這個問題。 在這種情況下,您應該使用 VisualStudio發布項目,然后將發布的文件夾放入 IIS。

web.config 文件中的這段配置對我有幫助:在 system.webServer 部分:

      <security>
          <requestFiltering>
              <verbs applyToWebDAV="true">
                  <remove verb="PUT" />
                  <add verb="PUT" allowed="true" />
                  <remove verb="DELETE" />
                  <add verb="DELETE" allowed="true" />
                  <remove verb="PATCH" />
                  <add verb="PATCH" allowed="true" />
              </verbs>
          </requestFiltering>
      </security>      

最近,我的所有 Web Api 2 路由/控制器都出現了 404 not found 錯誤。 因此,我進入實際服務器並嘗試使用 localhost 而不是主機名進行瀏覽,並得到“404.7 Not Found - 請求過濾模塊配置為拒絕文件擴展名”。

這篇SO帖子幫我解決了它。

當我為 UrlRoutingModule-4.0 啟用復選框時,它為我解決了:

IIS 管理器 > 模塊 > 選擇 UrlRoutingModule-4.0 > 編輯模塊 > 選中復選框“僅針對對 ASP.NET 應用程序或托管處理程序的請求調用”。

我有同樣的問題:在新安裝的帶有 Visual Studio 2013 的機器上,web api 項目在 IISExpress 下工作,但不在本地 IIS 下。 我嘗試了我能找到的所有方法,但最終問題不是 Web API 所必需的,而是 MVC 所必需的:即使安裝了它,也沒有 MVC 項目在運行。

對我有用的是卸載 IIS(從添加/刪除 Windows 功能),然后重新安裝它,然后運行 ​​aspnet_regiis -i。 也許這對其他人有幫助。

我花了很多時間嘗試了很多事情,最終意識到我不是在站點/默認網站中添加我的網絡應用程序,而是在綁定到另一個端口的另一個網站中。 顯然,在端口 80 上嘗試 localhost 會得到 404。

我什么都不做,只是在 web.config 中添加這個標簽,它的工作這個問題出現以下幾點之一

  1. 在同一項目中使用 MVC 或 asp.net 表單使用 Web Api

  2. 在 Global.asax 中使用 RouteConfig 和 WebApiConfig 作為 GlobalConfiguration.Configure(WebApiConfig.Register); RouteConfig.RegisterRoutes(RouteTable.Routes);

  3. 將 RouteConfig 用於 2 個目的,asp.net 表單使用friendlyurl 和 mvc 路由用於 MVC 路由

我們只是在 web.config 中使用這個標簽,它會起作用。

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
   .........................
</modules>
</system.webServer>

Web API 和 .Net Core Web API 遇到了同樣的問題。 調試時在 VS 2017 中運行良好,但在發布到 IIS 7.5 時返回 404。 我的解決方案是改變我創建網站的方式。 而不是發布到網站的根目錄(通過右鍵單擊站點...添加網站創建),我必須創建一個應用程序(通過右鍵單擊網站...添加應用程序創建)並發布到該文件夾​​。 請注意,對於 Core 版本,我必須將 Application Pool .NET Framework Version 設置更改為“No Managed Code”。

對我來說,解決方案是從我的 web.config 文件中刪除以下幾行:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
</dependentAssembly>
<dependentAssembly>
    <assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>

我注意到 VS 自動添加了它們,不知道為什么

試試這個 webconfg.. 用你的主 dll 替換“NewsApi.dll”!


<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\NewsApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
</configuration>

這是一個非常明顯的答案/新手錯誤,但我想我會把它放在這里以防它可能對某人有所幫助。 所以我的結構是在 IIS 中有一個網站,前端作為網站下的一個應用程序,后端是另一個。 后端應用程序下面有六個單獨的 api 應用程序。 我忘記將每個 api 文件夾轉換為 IIS 中的應用程序,當然這導致到我的 api 端點的路由返回 404.0 錯誤。

我的觀點:首先檢查簡單的東西! 確保您已將所有文件夾轉換為 IIS 中的應用程序,這是您的網站正常運行所必需的。

我有一個類似的問題,因為我沒有為 web api 正確定義路由。 這是我的解決方案:

public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } );

 }

這些頁面幫助了我:

https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834746(v=vs.118)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/configuring-aspnet-web-api

以上都不適合我。 最后,它與任何配置無關。

我在嘗試使用內置的 IISExpress 10.0 通過 Visual Studio 2017 運行調試會話時遇到 404 錯誤。 對我來說,當發布發布到 IIS 服務器時它正在工作,但在通過 VS 本地調試時得到 404。

問題原來是一些舊的編譯文件位於項目 bin 目錄中,這些文件似乎有干擾。 最后做了一個“干凈的解決方案”,關閉VS,刪除bin和obj文件夾。 重新啟動 VS 並重建項目,錯誤消失了。

你在做什么類型的 HTTP 請求?

這是一個稍微偏左的答案,但您是否嘗試刪除 404 的 IIS 默認錯誤頁面以檢查您的 API 實際返回的內容?

我有一個問題,我希望控制器方法在我向其發布錯誤的 ID 時返回 404。 我發現我總是從我的 API 獲得 IIS 404“找不到文件或目錄”頁面,而不是 HTTP 響應。 刪除默認的 404 錯誤頁面解決了問題。

不同的問題,但你永遠不知道它可能有幫助;)

確保未選擇解決方案->項目->右鍵單擊屬性->應用程序->自動生成綁定重定向

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM