簡體   English   中英

DELETE/PUT 動詞導致 404 Not Found in WebAPI,僅在本地運行時

[英]DELETE/PUT verbs result in 404 Not Found in WebAPI, only when running locally

我知道這是一個經常解決的問題,我已經做了很多關於 SO 的帖子所建議的一切。 當我嘗試從在本地 IIS 下運行的 MVC5 前端使用 WebAPI(版本 2)刪除記錄時,我收到 404 Not Found 響應。 以下是我嘗試過的事情:

我在我的 WebAPI web.config 中的<system.webServer />下添加了以下內容:

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

我已經按照以下說明操作: http://geekswithblogs.net/michelotti/archive/2011/05/28/resolve-404-in-iis-express-for-put-and-delete-verbs.aspx ,基本上說修改IIS“處理程序映射”中的ExtensionlessUrlHandler-Integrated-4.0 它說要雙擊處理程序,單擊“請求限制”和“允許 PUT 和 DELETE 動詞”。 我已經這樣做了,但我仍然收到 404 錯誤。

我已經完成了 IIS 重置。

這是我調用 WebAPI 刪除方法的 MVC5 前端代碼 - 請注意,當我手動導航到api/bulletinboard/get/{0} ,其中{0}是一個整數,我得到一個有效的JSON響應。 下面, contactUrihttp://localhost/SiteName/api/bulletinboard/get/53 ,它返回有效的JSON

[HttpPost, ActionName("Delete")]
        public ActionResult Delete(string appId, int id)
        {
            response = client.GetAsync(string.Format("api/bulletinboard/get/{0}", id)).Result;
            contactUri = response.RequestMessage.RequestUri;
            response = client.DeleteAsync(contactUri).Result;

            if (response.IsSuccessStatusCode)
            {
                return RedirectToAction("MessageList", new { appId = appId });
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot delete message due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return View("Problem");
            }
        }

這是我的 WebAPI 刪除方法:

[HttpDelete]
        public HttpResponseMessage Delete(int id)
        {
            BulletinBoard bulletinBoard = db.BulletinBoards.Find(id);
            if (bulletinBoard == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            db.BulletinBoards.Remove(bulletinBoard);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
            }

            return Request.CreateResponse(HttpStatusCode.OK, bulletinBoard);
        }

這是我的 WebAPI 項目中的 WebApiConfig.cs:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.EnableCors();

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "ApiWithActionName",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Formatters.Add(new PlainTextFormatter());
        }

問題:我還可以嘗試什么來解決此錯誤? 當從我的本地環境部署到我公司的開發服務器時,這很好用。

對於那些仍在尋找啟用 DELETE & PUT 以下代碼解決我的問題的人

<validation validateIntegratedModeConfiguration="false" />
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

  <!--This will enable all Web API verbose-->
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

我已經按照以下說明操作: https : //forums.asp.net/t/1961593.aspx?DELETE+PUT+verbs+result+in+404+Not+Found+in+WebAPI+only+when+running+本地

這表示只更改 Web.config 中的這段代碼,對我來說效果很好!

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
      </customHeaders>
    </httpProtocol>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
       <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
       <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

       <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
       <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
       <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

如果您使用的是 IIS,請確保在請求過濾中將 HTTP 動詞設置為允許。 如果它不在那里,您可以將其設置為允許它放在一邊。

在此處輸入圖片說明

我們正在努力解決 DELETE/PUT 在 IIS 8 上返回 404 錯誤的問題。我們做了上述所有答案,將 web.config 更改為接受所有動詞,在請求過濾中啟用 put/delete。 我們還通過多種方式禁用了 webDAV。 我們發現應用程序池被設置為經典詩句集成(它應該是什么)。 現在 DELETE/PUT 動詞工作正常。

這個問題可以通過 IIS 級別的配置來解決 - 打開 IIS-> 選擇你的網站 -> IIS(部分) -> 請求過濾 -> HHTP 動詞

刪除 DELETE 動詞/或允許 DELETE 動詞

問題將得到解決。

我所做的只是通過 WebAPI 項目上的項目屬性從使用本地 IIS 切換到 IIS Express,作為一種解決方法。 這樣做並刪除記錄會導致 405 Method Not Allowed 錯誤。 然后我更改了代碼行:

response = client.GetAsync(string.Format("api/bulletinboard/get/{0}", id)).Result;
contactUri = response.RequestMessage.RequestUri;
response = client.DeleteAsync(contactUri).Result;

到:

response = client.DeleteAsync(string.Format("api/bulletinboard/delete/{0}", id)).Result;

這很奇怪,因為我有另一個項目運行第一個代碼塊,它刪除記錄就好了。 無論如何,這解決了我的本地問題。 我知道這並不能真正解決我使用本地 IIS 的主要問題,但這種解決方法對我有用。

Mark Jensen 解決方案對我有用。

剛剛將我的應用程序池從“經典”更改為“集成”,我的請求有效。

如果您的項目在 IIS 下運行而不是在 IISExpress 下運行,請嘗試將 IISExpress 托管管道模式設置為集成。 PUT 和 DELETE 動詞在經典托管管道模式下似乎有問題。

祝你好運..

羅伯托。

對我來說,它是一個名為 UrlScan 的 ISAPI 模塊,我必須從應用程序中完全刪除它。

暫無
暫無

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

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