删除返回错误405(方法不允许)我正在使用React和ASP.Net Core

问题描述 投票:0回答:2

我正在尝试使用行上的 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");
                }
            });
        }
    }
asp.net reactjs asp.net-core plesk
2个回答
3
投票

根据 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 面板之前,您可能都必须执行此操作。

编辑20240501

为了防止在发布应用程序时执行此操作,请将更新的 web.config 包含在项目的根目录中。一旦您构建,它将包含在您的构建中。

干杯!


1
投票
您需要在响应中添加 CORS 标头以启用跨源 DELETE 请求。

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-...

 标头。

© www.soinside.com 2019 - 2024. All rights reserved.