You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:35:56