[英]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
響應。 下面, contactUri
是http://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>
我們正在努力解決 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.