Asp.Net Core Web API 参数

//多参数传递
[HttpPost]
public IActionResult Post(string a,string b)
{}
//ajax不可设置为contentType: "application/json;",不设置
//ajax data直接传入JSON对象data:{ "a": "1", "b": "2" }或者data:"a=1&b=2"
//传递参数名和接受的参数名必须一致
如果public IActionResult Post(string a),那么传值data: { "": "Jim" },a的值就是jim
前端传入data: {a:["11","22","33"]},后端接收public IActionResult Sort(string[] a)
//JSON对象传递,只能传递一个参数, js如下设置
//ajax contentType: "application/json;", 设置之后变成了Request Payload
//ajax JSON.stringify(data),需要转化为JSON字符串
//后台只接收一个参数,类型为dynamic、object、model
//后台必须使用[FromBody]
[HttpPost]
public IActionResult Post([FromBody]dynamic d)
public IActionResult Post([FromBody]object d)
public IActionResult Post([FromBody]model d)

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的权限,如果没有这个用户,添加即可

在iconfont.cn选择图标注意的几个问题, iconfont图标大小

在用iconfont的过程中,经常遇到图标大小显示不一致,实际上是因为在选的时候没有注意到细节,注意到下面的几个细节,就可以图标大小一致,下图为例:

fonicon大小对比

1、用chrome查看,黑色的框内(svg.icon)数值一致,此值显示了原图的比例,如果比例不一致,导致图标大小不一。

2、在淡蓝色的区块中,明显看到钻石的顶部和底部没有抵满,在页面上显示的时候会显示钻石更小,虽然尺寸一样。

3、明显钻石的线条更粗,这样如果背景和字体的颜色反差较大,能明显感觉钻石突兀,所以选的时候尽量选择线条粗细一致的图标。

另外在选择图标的时候尽量选择同样边框的图标,比如一个是圆角一个是直角的图标,这两种图标排列在一起的时候,感觉很不好。

关于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的机制有关系

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登陆错误,改两处设置正常,反正是调试环境,正常就可以。

http://www.fanxiaodong.com/2019/01/10/asp-net-core-iis-apppoll-%E7%99%BB%E9%99%86%E5%A4%B1%E8%B4%A5%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/

总结:

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

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

 


asp.net mvc 获取同name input情况

<input name="a" value="1"/>
<input name="a" value="2"/>
<input name="a" value="3"/>
<input name="a" value="b"/>最后一个为字符

 获取方式:

1、Request.From[“a”] 结果为字符串”1,2,3,b”

2、使用参数获取,如:add(string a),结果为1

3、使用数组参数获取,如add(string [] a),结果为数组1,2,3,4,使用add(int[] a )结果为int数组1,2,3   b被忽略掉