Ho una piccola applicazione che utilizza EF Core 1.0 con ASP.NET Core 1.0 MVC WebApi, funziona perfettamente in scenari self-hosting Kestrel (IIS Express). Quando pubblico su IIS 7.0, ottengo 404 errore quando chiamo metodo uso EF Core, ma quando chiamo metodo che non usa EF Core funziona perfettamente.
[Route("api/[controller]")]
public class MyModelController : Controller
{
private readonly IExampleRepository _exampleRepository;
public MyModelController(IExampleRepository exampleRepository)
{
_exampleRepository = exampleRepository;
}
[HttpGet("GetTestAll")] //RUN PERFECTLY ON IIS
public IEnumerable<string> GetTest()
{
return new string[] { "value1", "value2", "value3", "value4" };
}
// GET: api/mymodel
[HttpGet("", Name = "GetAll")] //ERROR 404 ON IIS
public IActionResult Get()
{
try
{
return Ok(_exampleRepository.GetAll().Select(x => Mapper.Map<MyModelViewModel>(x)));
}
catch (Exception exception)
{
//logg exception or do anything with it
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
...
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
var configurationSection = Configuration.GetSection("ConnectionStrings:DefaultConnection");
services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(configurationSection.Value));
// Add framework services.
services.AddMvc();
services.AddScoped<IExampleRepository, ExampleRepository>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Mapper.Initialize(config =>
{
config.CreateMap<MyModel, MyModelViewModel>().ReverseMap();
});
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseMvc();
}
}
Estrai project.json
"Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
"Microsoft.ApplicationInsights.AspNetCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.AspNetCore.Server.WebListener": "1.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Microsoft.AspNetCore.StaticFiles": "1.0.0",
"Microsoft.EntityFrameworkCore": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview2-final",
"type": "build"
},
"AutoMapper": "5.0.0"
}}
Qual è la configurazione per l'utilizzo di EF Core 1.0 con ASP.NET Core 1.0 MVC WebApi su IIS Server.
Grazie per l'aiuto. Si troverà in questo url un'applicazione che risponde allo stesso criterio che darà un errore 404 dopo essere stato eseguito su IIS 7.0
https://github.com/FabianGosebrink/ASPNET-Core-Entity-Framework-Core
Il problema è che quando utilizzo una stringa di connessione con un numero intero sicuro e lo distribuisco su un IIS 7 sulla mia workstation, IIS usa il nome del mio computer e non il mio come identificatore per il core di Entityframework.
La procedura migliore per utilizzare il routing è definire il percorso in un attributo di percorso separato.
Quindi, il tuo codice dovrebbe assomigliare a questo:
[Route("api/[controller]")]
public class MyModelController : Controller
{
private readonly IExampleRepository _exampleRepository;
public MyModelController(IExampleRepository exampleRepository)
{
_exampleRepository = exampleRepository;
}
[HttpGet] //RUN PERFECTLY ON IIS
[Route("GetTestAll")]
public IEnumerable<string> GetTest()
{
return new string[] { "value1", "value2", "value3", "value4" };
}
// GET: api/mymodel
[HttpGet] //ERROR 404 ON IIS
[Route("GetAll")]
public IActionResult Get()
{
try
{
return Ok(_exampleRepository.GetAll().Select(x => Mapper.Map<MyModelViewModel>(x)));
}
catch (Exception exception)
{
//log exception or do anything with it
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
}
Provaci.