ASP.NET Core Web API部署IIS后PUT请求报405错误的解决方法
解决ASP.NET Core 6中PUT请求返回405错误的问题
问题场景
部署在IIS上的ASP.NET Core 6应用中,PUT请求返回405 - HTTP verb used to access this page is not allowed,响应头显示允许的方法仅为GET、HEAD、OPTIONS、TRACE,GET请求可正常执行。相关代码如下:
服务层代码
public Response<object> AppendStatus(string acctNumber, string appendName) { var response = new Response<object>(); try { using (AseConnection con = new AseConnection(aseConnection)) { AseCommand cmd = new AseCommand("sp_append", con); cmd.CommandType = CommandType.StoredProcedure; var managerId = CodeUsername.Username; cmd.Parameters.AddWithValue("@AggregatorId", managerId); cmd.Parameters.AddWithValue("@AcctNo", acctNumber); cmd.Parameters.AddWithValue("@ManagerName", appendName); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } response.Success = true; } catch (Exception ex) { _logger.Error($"An Error occured " + ex.ToString()); response.Success = false; } return response; }
控制器代码
// BaseController [Produces("application/json")] [ApiController] public class BaseApiController : ControllerBase { } // ManagerController [Consumes("application/json")] [Authorize] [Route("api/v1/[controller]")] public class ManagerController : BaseApiController { private readonly ILogger<ManagerControllerr> _logger; private IAccountsTransService _accountsTransService; public ManagerController( ILogger<ManagerController> logger, IAccountsTransService accountsTransService ) { _logger = logger; _accountsTransService = accountsTransService; } [HttpPut] [Route("account/append")] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public ActionResult<Response<object>> AppendAccount(string acctNumber, string appendName) { var result = _accountsTransService.AppendAccount(acctNumber, appendName); return result; } }
解决方案
1. 禁用或卸载IIS的WebDAV模块
WebDAV模块会拦截PUT、DELETE等HTTP动词,是导致405错误的常见原因:
- 若无需WebDAV,直接卸载IIS中的WebDAV发布功能:打开服务器管理器 → 删除角色和功能 → 取消勾选WebDAV发布后完成卸载。
- 无法卸载时,在应用的
web.config中添加配置禁用WebDAV:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
2. 修正控制器参数绑定逻辑
当前PUT方法参数默认从URL查询字符串取值,若客户端通过请求体传递JSON参数,需调整绑定方式:
- 创建DTO类接收参数:
public class AppendAccountRequest { public string AcctNumber { get; set; } public string AppendName { get; set; } }
- 修改控制器方法,指定从请求体绑定参数:
[HttpPut("account/append")] public ActionResult<Response<object>> AppendAccount([FromBody] AppendAccountRequest request) { var result = _accountsTransService.AppendStatus(request.AcctNumber, request.AppendName); return result; }
(注:代码中服务层方法名为AppendStatus,控制器调用的是AppendAccount,需确认方法名一致性,避免隐性错误)
3. 检查IIS请求筛选规则
- 打开IIS管理器,找到目标站点 → 功能视图 → 请求筛选 → HTTP谓词。
- 确认PUT谓词已被允许,若未添加,点击"允许谓词"并添加PUT。
4. 确认ASP.NET Core路由配置
在Program.cs中确保路由中间件正确配置:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); // 确保此中间件已添加,保证API路由正常工作 app.Run();
5. 修正控制器中的拼写错误
控制器注入的ILogger泛型参数为ILogger<ManagerControllerr>,多了一个'r',会导致依赖注入失败,需修正为ILogger<ManagerController>。
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

