【问题标题】:.Net core 3.1 Simple View returning internal server error 500.Net core 3.1 简单视图返回内部服务器错误 500
【发布时间】:2021-04-09 07:00:11
【问题描述】:

最近我向question 询问了有关通过网络浏览器公开控制台应用程序的问题。我收到了一个非常 helpful answer 并按照提供的 link 中的说明进行操作,但随后我似乎无法显示简单的视图,即使返回 OK 工作正常:

程序.cs

class Program
{
    static void Main(string[] args)
    {
        var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .Build();

        host.Run();
    }
}

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc();
    }
}

Controller.cs

public class HomeController : Controller
{
    [Route("home/Index")]
    public IActionResult Index()
    {
        //return Ok("Hello from a controller");   //THIS WORKS 

        IndexModel data = new IndexModel();         //THIS RETURNS INTERNAL SERVER ERROR 500
        data.Title = "THIS";
        data.Message = "MESSAGE";
        return View(data);
    }
}

模型和索引:

public class IndexModel
{
    public string Title { get; set; }
    public string Message { get; set; }
}

@page
@model ConsoleApp1.Views.Home.IndexModel
@{
}
<div>
    <p>@Model.Title</p>
    <p>@Model.Message</p>
</div>

这是我在尝试显示视图时遇到的错误

【问题讨论】:

    标签: c# asp.net-core razor console-application


    【解决方案1】:

    请注意,您正在创建一个asp.net-core-3.1 mvc 项目。

    您的项目结构应如下所示:

    然后将您的Startup 更改为:

     public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
         
        }
    
        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
    

    然后在您的project.csproj. 中将其更改为(注意它是Sdk="Microsoft.NET.Sdk.Web"):

     <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <PreserveCompilationContext />
      </PropertyGroup>
    
        <ItemGroup>
            <FrameworkReference Include="Microsoft.AspNetCore.App" />
        </ItemGroup>
    </Project>
    

    【讨论】:

    • 对不起,但我没有创建 MVC 项目,我创建了一个控制台应用程序,然后让它能够托管在端口上,以便与它通信。我没有相同的结构,我的项目有 因为它是一个控制台应用程序
    • 我知道是这种情况,但您可以将其更改为 Microsoft.NET.Sdk.Web 以使其正常工作
    【解决方案2】:

    乍一看,我没有看到默认路由配置

    app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
    

    我的建议是添加自定义异常中间件

    app.UseMiddleware<ExceptionMiddleware>();
    

    和自定义异常处理程序

     public class ExceptionMiddleware
    {
        private readonly RequestDelegate next;
    
        public ExceptionMiddleware(RequestDelegate next)
        {
            this.next = next;
        }
    
        public async Task InvokeAsync(HttpContext httpContext)
        {
            try
            {
                await next(httpContext);
            }
            catch (Exception ex)
            {
                //inspect the exception here
            }
        }
    

    然后在提交请求后调试并检查您收到的异常位置和类型。

    【讨论】:

    • 我听从了您的建议,但收到此错误未找到视图“索引”。搜索了以下位置:/Views/Home/Index.cshtml /Views/Shared/Index.cshtml /Pages/Shared/Index.cshtml
    • 嗯,这意味着您没有/Views/Home/Index.cshtml 文件。返回此 return View(data); 时,MVC 引擎搜索器会搜索 /Views/Home/Index.cshtml 以呈现视图。我还将测试如果您从HomeController/Index 中删除此[Route("home/Index")] 会发生什么。添加默认路由后,我不确定是否需要属性路由。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2020-10-20
    • 2019-11-10
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多