DELETE/PUT 动词在 WebAPI 中导致 404 Not Found,仅在本地运行时

Posted

技术标签:

【中文标题】DELETE/PUT 动词在 WebAPI 中导致 404 Not Found,仅在本地运行时【英文标题】:DELETE/PUT verbs result in 404 Not Found in WebAPI, only when running locally 【发布时间】:2014-01-15 14:56:16 【问题描述】:

我知道这是一个经常解决的问题,并且我已经完成了许多关于 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());
        

问题:我还有什么办法可以解决这个错误?当从我的本地环境部署到我公司的开发服务器时,这可以正常工作。

【问题讨论】:

您的请求 url 是 api/bulletinboard/get/0,而您正在尝试执行删除操作...不应该是 api/bulletinboard/delete/0 @KiranChalla 不,我应该是这样的。 DeleteAsync 获取 GET 请求的结果并将其删除。我有这个在另一个项目中工作。但是,我确实将其更改为您建议的内容,只是为了看看会发生什么,并且我遇到了相同的 404 错误。我认为 IIS 不喜欢 DELETE 请求... @KiranChalla 啊,这是一个非常奇怪的情况......看看下面我的答案。 【参考方案1】:

对于那些仍在寻找启用 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>

【讨论】:

我只需要添加到 WebAPI web.config 的标头来修复我的场景。我的配置不需要验证部分。 在我的情况下,添加所有行返回重复错误。因此,我只添加/启用了默认创建的内容,即: 另请注意方案是经典还是集成,具体取决于您的 IIS 设置方式跨度> 【参考方案2】:

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

也就是说只更改 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>

【讨论】:

【参考方案3】:

如果您使用的是 IIS,请确保您在请求过滤中将 HTTP 动词设置为允许。如果它不存在,您可以将其设置为允许它在旁边。

【讨论】:

【参考方案4】:

我们在 IIS 8 上遇到 DELETE/PUT 返回 404 错误的问题。我们完成了上述所有答案,将 web.config 更改为接受所有动词,在请求过滤中启用 put/delete。我们还以多种方式禁用了 webDAV。我们发现应用程序池设置为集成的经典诗句(应该是什么)。现在 DELETE/PUT 动词可以正常工作了。

【讨论】:

【参考方案5】:

Mark Jensen 解决方案对我有用。

刚刚将我的应用程序池从“经典”更改为“集成”,我的请求成功了。

【讨论】:

【参考方案6】:

这个问题可以通过 IIS 级别的配置来解决—— 打开 IIS->选择您的网站->IIS(部分)->请求过滤->HHTP 动词

删除删除动词/或允许删除动词

问题将得到解决。

【讨论】:

TY,这解决了我的问题。似乎网络配置没有自动添加这个,或者它只是没有自动添加这个。 ty【参考方案7】:

我所做的只是通过我的 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 的主要问题,但这种解决方法对我有用。

【讨论】:

【参考方案8】:

如果您的项目在 IIS 下而不是在 IISExpress 下运行,请尝试将 IISExpress 托管管道模式设置为集成。 PUT 和 DELETE 动词在 Classic Managed Pipeline 模式下似乎有问题。

祝你好运..

罗伯托。

【讨论】:

【参考方案9】:

对我来说,这是一个名为 UrlScan 的 ISAPI 模块,我必须将其从应用程序中完全删除。

【讨论】:

以上是关于DELETE/PUT 动词在 WebAPI 中导致 404 Not Found,仅在本地运行时的主要内容,如果未能解决你的问题,请参考以下文章

updateOrCreate 在 laravel 中导致 ErrorException

此代码如何在 ghostscript 中导致 -100 错误

EnterTransitionCoordinator 在 Android 5.0 中导致 NPE

Phonegap 插件:BarcodeScanner 在 Eclipse 中导致错误

MapFragment 在 getMapAsync(this) 方法中导致 NullPointerException

在 Oracle 中导致错误的 SQL 插入语句