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身份验证中,为了测试用户登陆,直接用代码给赋值

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

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

asp.net core 微信调试 IIS,微信本地调试

 需求:微信开发需要验证域名,每次与微信的通讯的都是建立在域名之上,所以需要在服务器上开发,但是服务器速度配置没法跟本地环境比,还是弄到本地开发比较舒服。

第一步 映射域名到本地电脑

要做的第一步是让域名可以访问本地,类似花生壳、ngrok、natapp等软件可以把域名映射到外网,但是都有限制,要么死贵,要么域名不固定,如果域名不固定除了每次配置微信开发设置,还要配置本地的vs设置,花点钱省点心吧,我用的是 http://natapp.cn,一个月9块钱,购买的时候输入 优惠码 可以9折优惠 :D91C1DAA

此时注意几个问题:因为natapp的隧道是用阿里云的服务器,所以用自己的域名需要备案,否则域名无法访问。

1、如果想用自己的域名,而且已经备案,选择其中套餐即可。
2、如果想用自己的域名,但是未备案,选择HK套餐(香港)。
3、如果用natapp提供的二级域名,在购买的时候选择 不需要二级域名,在后台的隧道配置中,在去申请一个natapp已经备案的二级域名,3元/年。
根据教程配置好,用域名访问到本地IIS即可完成此步骤。

第二步 配置IIS

1、主目录设置:指向开发目录而不用指向发布目录

2、应用程序池选择,无托管代码

第三步 设置VS

此时点击调试或者在浏览器中打开,浏览器url显示域名,网站正常打开。

第四步 排错

我的数据库也在本地,appsettings.json里之前设置的连接字符串无法登陆,提示SQL登陆错误,改两处设置正常,反正是调试环境,正常就可以。

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

总结:

1、这样设置了之后,调试的时候断点也可以进来,也方便调试,特别是发送和接收微信消息的时候比较方便。

2、代码改完之后,浏览即可出效果,不用发布。

 


asp.net core mvc 404错误

遇到这个错误,一定不要慌,第一、看下路由是否正确,如果刚刚还能打开,并且没有改动路由信息,现在就404那就不是路由的问题。第二、如果确认路由没动,这时候最恶心了,一定要看下依赖注入是不是没有注册?在 Startup.cs文件中,public void ConfigureServices(IServiceCollection services){},浏览器怎么都是404,调试vs不报错,不报错…耽误我几个小时…,第三看有没有写错,如果 写成了 private readonly Logger _logger ;而不是private readonly ILogger _logger ;也会一样的404报错,vs不报错,所以一定要注意,传入的必须是Interface,写错一个字母就404了

记一次惨痛的EF报错 When attaching existing entities, ensure that only one entity instance with a given key value is attached

InvalidOperationException: The instance of entity type ‘Category’ cannot be tracked because another instance with the same key value for {‘CategoryID’} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using ‘DbContextOptionsBuilder.EnableSensitiveDataLogging’ to see the conflicting key values.
翻译过来的内容大致是:实体 category不能被跟踪,因为有一个同样key categoryID已经被跟踪。
一、情况描述
一个新项目,用了ASP.net Core MVC开发,ORM使用EF,ASP.net Core 默认使用了依赖注入的概念。很简单的一个功能,就是一个层级的类别管理,在列表、添加页面都没有出现问题,唯独在更新的时候出现了问题,项目使用了两层的仓库结构,使用了默认的依赖注入,使用了unitOfwork,项目结构如下:

二、出现此问题的原因:大致理解为ef跟踪的内容已经不是从初始化上下文跟踪的内容
三、网上查到的解决办法,
1、使用AsNoTracking()不进行跟踪,但是这种方法不能对数据进行更新,只能查询,但是我这里需要更新。
2、更新之前重新查询一次数据然后更新,这个显然有点蛋疼。

四、错误排除方法:
1、是否造成多次实例化context,查询和更新的上下文不是一个,经过对context构造函数的日志输出,确认每次请求只实例化1个context。
2、调试程序,观察当前model的EntityState状态,发现是Detached,Detached的解释:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态,我用了微软asp.net core mvc 示例同样调试状态发现也是Detached,所以这个可以排除。
3、由于用了两层的仓储(BLL,DAL),剥开每一层进行测试,跳过BLL使用DAL测试,跳过BLL,DAL,直接使用context,发现都没有问题,那么问题可能出在BLL层。对BLL的方法一个个测试,发现只要不执行GetTree()方法,问题就不会出现。
这个方法的目的是将类别树取出来,进行排序用于显示,第二个方法做一个递归,有一个全局变量_tree保存处理结果,通过Category._tree调用。

发现两个问题
第一、一旦var list=_repository.GetList().ToList()就不能更新时候报错,我理解是_repository是引用类型,ToList之后,ef里的实体就会被Tolist,ef的跟踪状态发生了变化。
第二、不用Tolist,改成IQueryable,往下面走,foreach (var item in tempList){},这个方法改成一个空方法依然更新时候报错,我理解,在foreach的时候,IQueryable已经不在表达式了,已经是从数据库里取出了数据,ef的跟踪状态发生了变化,所以报错。

那么GetTree()是什么时候执行的呢,这又是一个错误,为了每次方便取出_tree,我把GetTree(),写到了控制器的构造函数里,造成不管是查询,更新都会先执行一次GetTree()。

五、总结
正常更新的时候是前台传递过来model,后台获取context,更新model到context,这个期间不要动context,不要tolist和foreach操作,虽然EntityState也是Detached,但是不能进行更新。
这个问题差不多一整天都在解决,多么痛的领悟。