如何解决ASP.NET Core Web API DELETE调用返回405
当我尝试执行DELETE调用时,我的asp.net核心Web API返回405。当API在我的本地计算机上运行时,我可以成功发送删除调用。
在IIS中,该站点的“处理程序映射”下,WEbDAV将DELETE列为要处理的动词之一: IIS WebDAV settings
web.config也将DELETE列为指定动词
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="GET,POST,PATCH,DELETE" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\ServiceCatalog.API.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
从本地计算机进行测试时,删除终结点可以工作,但是一旦部署,我会收到405返回消息。
如果有帮助的话,这里是API中DELETE端点的代码
[HttpDelete("{id}")]
public ActionResult DeleteImage(int id)
{
Images img = new Images();
img.Imageid = id;
//Check that the recrod exists to be deleted. IF not return NotFound status
var imgCheck = _context.Images.Any(i => i.Imageid == img.Imageid);
if (!imgCheck)
{
return NotFound("No record found to delete.");
}
//delete selected image record
_context.Remove(img);
_context.SaveChanges();
// Return the id of the deleted record
return Ok("Image Id " + img.Imageid + " has been successfully deleted.");
}
API的ConfigureServices代码
// Cors Configuration
services.AddCors(o =>
{
o.AddPolicy(CorsPolicy,builder => builder
.WithOrigins("http://xxxweb011","http://xxxweb011.x.com")
.AllowAnyHeader()
.AllowAnyMethod());
});
services.AddMvc(o =>
{
o.ReturnHttpNotAcceptable = true;
});
// Connection string from environmental variables
var connectionString = Configuration["connectionString:101stg"];
// Connection to SQL
services.AddDbContext<ServiceCatalogContext>(option => option.UseSqlServer(connectionString));
services.AddControllers()
.AddNewtonsoftJson();
services.AddOData();
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
配置代码
public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
/*
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(appBuilder =>
{
appBuilder.Run(async context =>
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync("An unexpected fault happened. Try again later.");
});
});
app.UseDeveloperExceptionPage();
}
*/
app.UseDeveloperExceptionPage(); //Keeping always shown during development
app.UseRouting();
//added for screenshot uplaod
app.UseStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.EnableDependencyInjection();
endpoints.Select()
.OrderBy()
.Filter()
.SkipToken()
.MaxTop(100)
.Expand()
.Count();
endpoints.MapODataRoute("api","api",GetEdmModel());
});
app.UseCors(CorsPolicy);
app.UseStatusCodePages();
}
解决方法
尝试禁用/修改IIS中的所有WebDAV设置后,我发现对我来说唯一的解决方案最终是注释掉applicationHost.config文件中的以下代码行
<add name="WebDAVModule" />
为了安全起见,我也注释了以下一行
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。