The view ‘Index’ was not found. The following locations were searched:找不到视图解决办法

提示

InvalidOperationException: The view ‘Index’ was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml

解决方法:

现在的vs2022不知道为什么,选择mvc后,不添加相关mvc的nuget包,或者升级.net版本的时候会遇到这种情况,找不到视图,但是明明试图是存在了,两步:
1、安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包。

2、将program.cs里面的services.AddControllersWithViews();改成services.AddControllersWithViews().AddRazorRuntimeCompilation();

3 、完成以上两步基本调试的时候不报错了,但是可能发布后会报错,还是一样的错误提示,这时候要看下vs2022的版本了,vs2022 17.7.7 要更新一下,更新成vs2022.17.8.0就可以解决掉了,总之17.7.7还有其他莫名的错误,能升级升级。

webapi 直接输出图片

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(ms.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result ; 

网上的代码基本上都是这样的 但是api的请求结果是Json

{"Version":{"Major":1,"Minor":1,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1},"Content":{"Headers":[{"Key":"Content-Type","Value":["image/jpg"]}]},"StatusCode":200,"ReasonPhrase":"OK","Headers":[],"RequestMessage":null,"IsSuccessStatusCode":true}

最终结果,输入图片 使用IAcitonResult ,返回子类FileContentResult,直接输出图片

public IActionResult GetQr(string str)
{
    var img = LIB.QR.GetQrCode(str);
    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    return new FileContentResult(ms.ToArray(), "image/png");
}

关于导航属性的几点

var context = _context.Feedback.OrderByDescending(a=>a.AddTime);
[NotMapped]
Public User User{get;set;}

此时,_context.Feedback.Include(“User”),无法获取User

如果不加[NotMapped],以上代码获取到不为null的User,比如UserId=0,此时整条记录将不再显示。

asp.net core

asp.net core mvc ActionFilter 不继续执行下面的代码

在mvc的过滤器里面,执行相关的控制器之前,会先执行ActionFilter里面的代码,比如登陆时候,在执行admin/list的时候 先执行actionfilter里的代码,若果需要跳转,可以写成

context.HttpContext.Response.Redirect("/admin/login")

但是这样的问题,在于此时跳转后,会继续执行admin/list的代码,这是我们不希望的,改成

context.Result = new Microsoft.AspNetCore.Mvc.RedirectResult("/admin/login/");

这样程序将直接跳转,不会执行下面的请求

asp.net core iis apppoll 登陆失败解决方案

之前asp.net的时候都没有出过问题,用了asp.net core之后配置数据库连接总是有问题,总结了一下:

1、网站应用程序池选择Local System 。

2、数据库登录用户设置映射 public和db_owner

3、此时在通常情况下都没有问题,但是asp.net core出问题,最重要的一点,用数据库管理员登陆,查看登录名NT AUTHORITY\SYSTEM的权限,用户映射要给当前数据库 的public和db_owner ,这样才可以

总结:如果应用程序池选择NetWorkService,那么设置数据库中的NT AUTHORITY\NETWORK SERVICE的权限,如果没有这个用户,添加即可

关于HttpContext.SignInAsync无效的问题

asp.net core身份验证中,为了测试用户登陆,直接用代码给赋值

var claims = new[] { new Claim("userId","2") };
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
            {
                AllowRefresh = true,
                ExpiresUtc = DateTimeOffset.UtcNow.AddHours(24),//24
            };
_httpContextAccessor.HttpContext.SignInAsync(
                   CookieAuthenticationDefaults.AuthenticationScheme,
                   new ClaimsPrincipal(claimsIdentity),
                   authProperties);

执行完以上代码后紧接着执行

var claims = HttpContext.User.Claims;

发现设置claims 并没有成功,于是断点跟踪到_httpContextAccessor.HttpContext.SignInAsync,确实HttpContext.User.Claims没有值,下载了微软的示例代码,发现必须执行一个完整的页面才可以,也就是说执行完登陆代码之后,在另外的页面获取HttpContext.User.Claims才可以获取到,比如我们设置一个cookies或者session,设置完成之后紧接着代码就可以获取到这个值,但是HttpContext不同,必须完成一个完整的请求之后,才可以获取到新的值,这可能跟HttpContext的机制有关系