向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
相关产品推荐
相关产品推荐

