运行测试时无法在ASP.NET核心中调用API DELETE(不允许使用405方法)。但是它可以大摇大摆地工作

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

也许我需要在测试虚拟主机中设置某种权限?测试的获取和发布工作正常。但是,当它尝试在控制器上调用DELETE方法时,会收到HTTP 405错误。

    [HttpDelete("{id:int}")]
    public async Task<ActionResult<RfAttachmentModel>> DeleteByIdAsync(int id)
    {
        await _rfAttachmentService.DeleteByIdAsync(id);
        return NoContent();
    }


  public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseEnvironment("LocalTesting");

        builder.ConfigureServices(services =>
        {
            services.AddEntityFrameworkInMemoryDatabase();

            ServiceProvider provider = services
                .AddEntityFrameworkInMemoryDatabase()
                .BuildServiceProvider();

            services.AddDbContext<PwdrsContext>(options =>
            {
                options.UseInMemoryDatabase("Pwdrs");
                options.UseInternalServiceProvider(provider);
            });

            ServiceProvider sp = services.BuildServiceProvider();

            using (IServiceScope scope = sp.CreateScope())
            {
                IServiceProvider scopedServices = scope.ServiceProvider;
                PwdrsContext db = scopedServices.GetRequiredService<PwdrsContext>();
                ILoggerFactory loggerFactory = scopedServices.GetRequiredService<ILoggerFactory>();

                ILogger<CustomWebApplicationFactory<TStartup>> logger = scopedServices
                    .GetRequiredService<ILogger<CustomWebApplicationFactory<TStartup>>>();

                db.Database.EnsureDeleted();
                db.Database.EnsureCreated();

                try
                {
                    PwdrsContextSeed.SeedAsync(db, loggerFactory).Wait();
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, $"An error occurred seeding the " +
                        "database with test messages. Error: {ex.Message}");
                }
            }
        });
    }
}

EDIT1:这是测试项目中进行调用的方法

 [Fact]
    public async Task Delete_Item_By_Id()
    {
        HttpResponseMessage responseDelete = await Client.GetAsync("/api/RfAttachment/DeleteById/1");
        responseDelete.EnsureSuccessStatusCode();

        HttpResponseMessage responseGetAll = await Client.GetAsync("/api/RfAttachment/GetAll");
        responseGetAll.EnsureSuccessStatusCode();
        string stringResponse = await responseGetAll.Content.ReadAsStringAsync();
        List<RfAttachment> result = JsonConvert
            .DeserializeObject<IEnumerable<RfAttachment>>(stringResponse)
            .ToList();

        Assert.Single(result);
    }
c# asp.net-core http-delete httpverbs
2个回答
1
投票
必须设置以下项目才能启用:

网站应用程序池托管管道模式必须设置为

  • [集成] >>IIS中必须支持HTTP动词
  • 设置应用程序池管道模式
  • 转到IIS管理器>应用程序池

      找到目标的应用程序池:
    • (网站)>编辑(双击)>托管管道模式:集成
    • HTTP动词更新
  • 以下代码段应添加到web.config以启用所有动词,并确保WebDAV不会拦截和拒绝PUTDELETE。如果配置了默认的WebDAV,则WebDAV将截获PUTDELETE动词,返回405个错误(不允许使用方法)。

    <system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="WebDAV" /> <add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.AspNet" resourceType="File" preCondition="" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" /> </handlers> <modules> <remove name="WebDAVModule" /> </modules> </system.webServer>

    如果您喜欢GUI to add verbs,请转到IIS管理器>处理程序映射。找到ExtensionlessUrlHandler-Integrated-4.0,双击它。单击Request Restrictions...按钮,然后在Verbs选项卡上,同时添加DELETEPUT

    ““>
  • © www.soinside.com 2019 - 2024. All rights reserved.