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

向ASP.NET Core Web API发送PUT请求时出现405方法不允许错误

解决PUT请求返回405 Method Not Allowed的问题

1. 修正控制器路由与参数匹配

你的客户端请求URL包含ExerciseType/{item.ExerciseTypeId},但控制器的[HttpPut]未指定对应路由模板,且方法未接收URL中的ExerciseTypeId参数,导致路由无法匹配到该PUT方法,这是最可能的原因。

修改控制器方法的路由和参数:

[HttpPut("{exerciseTypeId}")] // 匹配URL中的ID参数
public async Task<IActionResult> Update(int exerciseTypeId, [FromBody] ExerciseType item, [FromQuery(Name = "useNavigationalProperties")] bool navigationalProperties)
{
    // 可选:验证URL中的ID与请求体中的ID是否一致
    if (exerciseTypeId != item.ExerciseTypeId)
    {
        return BadRequest("ID不匹配");
    }
    await _exerciseTypeContext.UpdateAsync(item, navigationalProperties);
    return Ok(); // 务必返回响应,否则客户端无法收到正确状态码
}

同时确保控制器类上有路由前缀:

[Route("api/[controller]")]
[ApiController]
public class ExerciseTypeController : ControllerBase
{
    // ... 其他代码
}

2. 配置ASP.NET Core内置CORS中间件

仅通过web.config添加自定义头可能不足以处理跨域,ASP.NET Core推荐用内置中间件配置:

var builder = WebApplication.CreateBuilder(args);

// 注册CORS服务
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowCrossOrigin", policy =>
    {
        policy.AllowAnyOrigin()
              .AllowAnyHeader()
              .AllowAnyMethod(); // 明确允许PUT、DELETE等方法
    });
});

builder.Services.AddControllers();

var app = builder.Build();

// 在路由之后、授权之前启用CORS
app.UseCors("AllowCrossOrigin");

app.UseAuthorization();

app.MapControllers();

app.Run();

如果需要严格控制跨域来源,可把AllowAnyOrigin()替换为WithOrigins("你的Xamarin应用访问地址")。

3. 彻底禁用WebDAV避免拦截请求

虽然你已移除WebDAV模块,可在web.config中补充配置确保PUT请求被ASP.NET Core处理:

<system.webServer>
    <handlers accessPolicy="Read, Script">
        <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
    </modules>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
        </customHeaders>
    </httpProtocol>
    <aspNetCore processPath="dotnet" arguments=".\你的API项目.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>

4. 验证客户端请求URL格式

在客户端打印完整请求URL,确认格式正确:

var fullUrl = Client._url + $"ExerciseType/{item.ExerciseTypeId}?useNavigationalProperties={useNavigationalProperties}";
Console.WriteLine(fullUrl); // 检查是否存在多余斜杠或路径错误
var response = await Client._httpClient.PutAsync(fullUrl, data);

同时确保HttpClient没有设置限制PUT方法的默认请求头。


内容的提问来源于stack exchange,提问作者dancho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:46:29