我正在構建一個 .NET Core (3.1) Web API,它被托管在 IIS 中。
我有2個端點:
/api/status
/api/widget/config/{id}
這兩個端點在本地運行時都能完美作業。/api/status端點在我部署的版本中也能作業。但是另一個端點在部署版本中出現了404錯誤。由于它在本地運行,我認為這是它的部署方式的一個問題。請你幫助我了解這個問題。
下面是我的2個控制器的代碼:
[Route("api/[controller]" )]
[ApiController]
public class StatusController : ControllerBase
{
[HttpGet]
公共ActionResult Get()
{
return Ok("API is available");
}
}
而且
[Route("api/[controller]" )]
[ApiController]
public class WidgetController : ControllerBase
{
private readonly IWidgetService service;
公共WidgetController(IWidgetService _service)
{
service = _service;
}
[HttpGet]
[Route("~/api/[controller]/[action]/{id}")]
public ActionResult Config(Guid id)
{
return Ok(service.GetWidgetConfig(id))。
}
}
下面是我的Program.cs和Startup.cs:
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build()。
using (var scope = host.Services.CreateScope()
{
var services = scope.ServiceProvider;
嘗試
{
SeedDatabase.Initialize(services)。
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>()。
logger.LogError(ex, "An error occured seeding the DB")。
}
}
host.Run()。
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseContentRoot(Directory.GetCurrentDirectory())。
webBuilder.UseIIS();
webBuilder.UseStartup<Startup>()。
});
而且
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(opts => opts.UseSqlServer(Configuration.GetConnectionString("sqlConnection"),
options => options.MigrationsAssembly("MyProject"))。
services.AddIdentity<ApplicationUser, IdentityRole>(opt =>
{
opt.Password.RequiredLength = 8;
opt.Password.RequireDigit = true;
opt.Password.RequireUppercase = true;
opt.Password.RequireNonAlphanumeric = true;
opt.SignIn.RequireConfirmedAccount = false。
opt.SignIn.RequireConfirmedAccount = false。
opt.SignIn.RequireConfirmedPhoneNumber = false;
}).AddEntityFrameworkStores<ApplicationDbContext>()。
services.AddScoped<IWidgetService, WidgetService>()。
services.AddCors(o => o.AddPolicy("CorsPolicy", builder => {
構建者
.WithMethods("GET", "POST")
.AllowAnyHeader()
.AllowAnyOrigin()。
}));
services.AddMvc()
.AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore)。)
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
如果(env.IsDevelopment())
{
app.UseDeveloperExceptionPage()。
}
否則
{
app.UseExceptionHandler("/Home/Error")。
// 默認的HSTS值是30天。你可能想在生產場景中改變這個值,見https://aka.ms/aspnetcore-hsts。
app.UseHsts()。
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseCors("CorsPolicy")。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
模式。"{controller=Home}/{action=Index}/{id?}")。)
});
uj5u.com熱心網友回復:
把你的控制器代碼改成這樣:
[Route("api/[controller]" )]
[ApiController]
public class WidgetController : ControllerBase
{
private readonly IWidgetService service;
公共WidgetController(IWidgetService _service)
{
service = _service;
}
[HttpGet("Config/{id}")]
public ActionResult Config(Guid id)
{
return Ok(service.GetWidgetConfig(id))。
}
}
uj5u.com熱心網友回復:
像下面這樣修改你的代碼:-
Startup.csapp.UseEndpoints(endpoints =>
{
endpoints.MapControllers()。
});
控制器:-
[ApiController]
[Route("api/[controller]")]
public class WidgetController : ControllerBase
{
private readonly IWidgetService service;
公共WidgetController(IWidgetService _service)
{
service = _service;
}
[HttpGet("Config/{id}")]
public ActionResult Config(Guid id)
{
return Ok(service.GetWidgetConfig(id))。
}
}
還可以嘗試在appsettings.Development.json檔案中寫入連接字串。
它將解決你的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311763.html
標籤:
上一篇:使用Microsoft.Extensions.DependencyInjection,我能否在提供額外的構造引數的同時決議型別并構造一個實體?
