简体   繁体   English

带有ASP.NET Core 1.0 MVC WebApi的EF Core 1.0错误404

[英]EF Core 1.0 with ASP.NET Core 1.0 MVC WebApi error 404

I have a small application that uses EF Core 1.0 with ASP.NET Core 1.0 MVC WebApi, is working perfectly in kestrel self-hosting scenarios (IIS Express) .When i publish on IIS 7.0, i get 404 error when i call method use EF Core, but when i call method that does not use EF Core it work perfectly. 我有一个使用EF Core 1.0和ASP.NET Core 1.0 MVC WebApi的小型应用程序,在红est自托管方案(IIS Express)中运行良好。当我在IIS 7.0上发布时,调用方法使用EF时出现404错误核心,但是当我调用不使用EF核心的方法时,它可以完美地工作。

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

Extract project.json 提取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"

} } }}

What is the configuration for using EF Core 1.0 with ASP.NET Core 1.0 MVC WebApi on IIS Server. 在IIS服务器上将EF Core 1.0与ASP.NET Core 1.0 MVC WebApi一起使用的配置是什么。

Thanks for your help. 谢谢你的帮助。 You would find at this url an application answering the same criterion that will give a 404 error after being pulse on IIS 7.0 您将在此URL上找到一个应用程序,该应用程序回答了在IIS 7.0上被脉冲后将给出404错误的相同条件

https://github.com/FabianGosebrink/ASPNET-Core-Entity-Framework-Core https://github.com/FabianGosebrink/ASPNET-Core-Entity-Framework-Core

is working perfectly in kestrel self-hosting scenarios (IIS Express) .When i publish on IIS 7.0, i get 404 error 在红est自托管方案(IIS Express)中运行良好。当我在IIS 7.0上发布时,出现404错误

It looks like an issue related to your publish process, not to EF because it's working when you debug. 它看起来像是与您的发布过程有关的问题,而不是与EF有关的问题,因为它在调试时起作用。

Either your _exampleRepository.GetAll() or Automapper probably need a file that is missing in your published project. _exampleRepository.GetAll()Automapper可能都需要一个已发布项目中缺少的文件。

In your project.json file you should include a list of everything you want to be copied during your publish process. project.json文件中,您应该包括要在publish过程中复制的所有内容的列表。 For example mine looks like this 例如我的看起来像这样

"publishOptions": {
    "include": [
      "wwwroot",
      "web.config",
      "appsettings.Development.json",
      "appsettings.Production.json",
      "Views",
      "Resources/*"
    ]
}

The best practice to use routing is to define the route in a separate route attribute. 使用路由的最佳实践是在单独的路由属性中定义路由。

So, your code should look like this: 因此,您的代码应如下所示:

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

Give it a try. 试试看。

问题是,当我使用带有安全整数的连接字符串并将其部署在工作站上的IIS 7上时,IIS会使用计算机的名称,而不是将其用作Entityframework核心的标识符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM