我正在尝试使用行上的 id 来删除该行。当我在本地服务器上执行它时,它工作正常,但在 plesk 服务器上有错误。 请求 CREATE 和 GET 工作正常,但 DELETE 和 UPDATE 不起作用。
功能删除:
onDeleteConfirmation(e) {
e.preventDefault();
const { id } = this.props.match.params;
axios.delete("api/Trips/DeleteTrip/" + id).then(result => {
this.props.history.push('/Trips')
});
}
功能更新:
onUpdateConfirmation(e) {
e.preventDefault();
const { id } = this.props.match.params;
let tripObject = {
name: this.state.name,
description: this.state.description,
dateStarted: this.state.dateStarted,
dateComplated: this.state.dateComplated
}
axios.put("api/Trips/UpdateTrip/"+id, tripObject).then(result => {
this.props.history.push('/Trips')
});
}
控制器服务:
[HttpDelete("DeleteTrip/{id}")]
public IActionResult DeleteTrip(int id)
{
_service.DeleteTrip(id);
return Ok();
}
。 我在 Visual Stdio 中使用 ASP.Net Core 3 和 React。 当我尝试在在线服务器 Plesk 上执行时,我的问题就解决了。
这是完整的控制器:
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Trips.Data.Models;
using Trips.Data.Services;
namespace Trips.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TripsController : ControllerBase
{
public ITripService _service { get; set; }
public TripsController(ITripService service)
{
_service = service;
}
[EnableCors("AnotherPolicy")]
[HttpGet("GetTrips")]
public IActionResult GetTrips()
{
try
{
//throw new Exception();
var allTrips = _service.GetAllTrips();
return Ok(allTrips);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
[EnableCors("AnotherPolicy")]
[HttpGet("SingleTrip/{id}")]
public IActionResult GetTripById(int id)
{
var trip = _service.GetTripById(id);
return Ok(trip);
}
[EnableCors("AnotherPolicy")]
[HttpPost("AddTrip")]
public IActionResult AddTrip([FromBody] Trip trip)
{
if (trip != null)
{
_service.AddTrip(trip);
}
return Ok();
}
[EnableCors("AnotherPolicy")]
[HttpPut("UpdateTrip/{id}")]
public IActionResult UpdateTrip(int id, [FromBody] Trip trip)
{
_service.UpdateTrip(id, trip);
return Ok(trip);
}
[EnableCors("AnotherPolicy")]
[HttpDelete("DeleteTrip/{id}")]
public IActionResult DeleteTrip(int id)
{
_service.DeleteTrip(id);
return Ok();
}
}
}
.
StartUp.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/build";
});
//
services.AddTransient<ITripService, TripService>();
services.AddCors(options =>
{
options.AddPolicy("AnotherPolicy",
builder =>
{
builder.WithOrigins(
"http://hirkansolar.ir/",
"http://react.hirkansolar.ir/"
)
.AllowAnyHeader()
.WithMethods("PUT", "DELETE", "GET", "POST");
});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseRouting();
// ----
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start");
}
});
}
}
根据 Plesk 的说法,这是因为 WebDAV 和 .NET Core IIS 处理程序冲突,建议从网站配置中禁用 WebDAV 模块及其标头。
https://support.plesk.com/hc/en-us/articles/360008566053-HTTP-Error-405-Method-Not-Allowed-when-using-PUT-method-in-ASP-NET-or- NET-Core-应用程序与 Web-API
将以下代码添加到您的 web.config 文件中。
<system.webServer>
<modules>
<!-- Remove WebDAV module so that we can make DELETE requests -->
<remove name="WebDAVModule" />
</modules>
<handlers>
<!-- Remove WebDAV module so that we can make DELETE requests -->
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
other configs here...
</system.webServer>
每次将应用程序文件上传到 Plesk 面板之前,您可能都必须执行此操作。
干杯!
https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0
在你的Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options => { // <--- define a policy
options.AddDefaultPolicy(builder => {
builder.WithOrigins(
"http://example.com",
"http://www.contoso.com"
)
.AllowAnyHeader()
.AllowAnyMethod();
});
});
// ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseRouting();
app.UseCors(); // <--- enable the middleware
// ...
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
进行此更改后,响应应包含 Access-Control-Allow-...
标头。