Невозможно вызвать API DELETE в ядре ASP. NET при выполнении моих тестов (метод 405 не разрешен). НО это работает в чванстве - PullRequest
1 голос
/ 11 марта 2020

Может быть, есть какие-то разрешения, которые мне нужно настроить на тестовом веб-хосте? Get и Post для тестов работают нормально. Но получите ошибку HTTP 405 при попытке вызвать метод DELETE на контроллере.

    [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);
    }

Ответы [ 2 ]

2 голосов
/ 21 марта 2020
    HttpResponseMessage responseDelete = await Client.GetAsync("/api/RfAttachment/DeleteById/1");
    responseDelete.EnsureSuccessStatusCode();

Это неправильно, вы звоните GetAsync, вы должны вызывать DeleteAsync, поскольку вы пометили свой метод с помощью [HttpDelete] глагола.

    HttpResponseMessage responseDelete = await Client.DeleteAsync("/api/RfAttachment/DeleteById/1");
    responseDelete.EnsureSuccessStatusCode();
1 голос
/ 21 марта 2020

Если ваш IWebHost работает под управлением IIS / IIS Express, вам может потребоваться включить PUT и DELETE в IIS.

Для включения должны быть установлены следующие элементы:

  • Режим управляемого конвейера пула веб-приложений должен быть установлен на Интегрирован
  • HTTP-глаголы должны поддерживаться в IIS

Установить режим конвейера пула приложений

  • Go на IIS Manager> Пулы приложений
  • Найти приложение Пул для цели:
    • (веб-сайт)> Изменить (двойной щелчок)> Режим управляемого конвейера: Интегрированный

Обновление глагола HTTP

Следующий фрагмент должен быть добавлен к web.config, чтобы включить все глаголы, и убедиться, что WebDAV не перехватывает и не отклоняет PUT и DELETE. Если настроено WebDAV по умолчанию, WebDAV будет перехватывать глаголы PUT и DELETE, возвращая 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 добавить глаголы , go в IIS Manager> Отображения обработчиков. Найдите ExtensionlessUrlHandler-Integrated-4.0, дважды щелкните по нему. Нажмите кнопку Request Restrictions... и на вкладке Verbs добавьте DELETE и PUT.

IIS Verbs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...