也许我需要在测试虚拟主机中设置某种权限?测试的获取和发布工作正常。但是,当它尝试在控制器上调用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);
}
网站应用程序池托管管道模式必须设置为
转到IIS管理器>应用程序池
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 to add verbs,请转到IIS管理器>处理程序映射。找到ExtensionlessUrlHandler-Integrated-4.0
,双击它。单击Request Restrictions...
按钮,然后在Verbs
选项卡上,同时添加DELETE
和PUT
。
“>