【问题标题】:DELETE return ERROR 405(Method Not allowed) I'm using React and ASP.Net CoreDELETE return ERROR 405(Method Not allowed) 我正在使用 React 和 ASP.Net Core
【发布时间】:2021-08-27 03:24:32
【问题描述】:

我正在尝试使用行上的 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();
    }

. 我在视觉标准输出中使用 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


【解决方案1】:

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

https://docs.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-... 标头。

【讨论】:

  • 我使用UseCores(),但没有工作,也不允许使用更新和删除。我更改了StartUp.cs 并添加了两个部分。
  • 你能发布你的 Startup.cs 吗?
  • 您的问题肯定是由 CORS 问题引起的。它需要正确设置才能运行。
  • @abdusco 问题是 plesk 上的配置。 PUT、PATCH、DELETE 不适用于大多数使用 plesk 的共享主机。
  • @abdusco 因此,根据 Plesk 的说法,这是因为 WebDAV 和 .NET Core IIS 处理程序发生冲突,Plesk 建议从网站配置中禁用 WebDAV 模块及其标头。我发布了一个答案
【解决方案2】:

根据 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-application-with-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 面板之前,您可能每次都必须这样做。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2014-04-09
    • 2018-06-28
    • 2019-10-08
    • 2015-08-16
    • 2020-09-22
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多