首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,590 阅读
2
Mac打印机设置黑白打印
4,905 阅读
3
修改elementUI中el-table树形结构图标
4,875 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,654 阅读
5
intelliJ Idea 2022.2.X破解
4,333 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Spring Cloud
Mac
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
.Net
Spring Cloud Alibaba
MySQL
Mybatis-Plus
Typecho
jQuery
Java Script
微信小程序
Oracle
Laughing
累计撰写
621
篇文章
累计收到
1,419
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
13
篇与
的结果
2018-03-10
Asp.Net实现图形验证码
平时我们使用验证码的情形还是非常多的,比如登陆界面、发送短信验证码等,现在新的验证方式也又很多,比如数学计算或者滑块等,这里我们仅仅介绍传统的图形验证码。修改web.config,设置图形验证码的位数 <appSettings> <add key="VerifyCodeNum" value="4"/> </appSettings> 生成图片公共类using System; using System.Collections.Generic; using System.Configuration; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Web; /// <summary> /// VerifyCode 的摘要说明 /// </summary> public class VerifyCode { public VerifyCode() { // // TODO: 在此处添加构造函数逻辑 // } /// <summary> /// 生成随机数 /// </summary> /// <returns></returns> public static string GetVerifyCode() { //获取系统配置的随机数的位数 int vCodeNum = Convert.ToInt32(ConfigurationManager.AppSettings["VerifyCodeNum"]); string vChar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" + ",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" + ",R,S,T,U,V,W,X,Y,Z"; string[] vArray = vChar.Split(','); string code = "";//产生的随机数 int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数 Random rand = new Random(); //采用一个简单的算法以保证生成随机数的不同 for (int i = 1; i < vCodeNum + 1; i++) { if (temp != -1) { rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类 } int t = rand.Next(61);//获取随机数 if (temp != -1 && temp == t) { return GetVerifyCode();//如果获取的随机数重复,则递归调用 } ttemp = t;//把本次产生的随机数记录起来 code += vArray[t];//随机数的位数加一 } return code; } /// <summary> /// 该方法是将生成的随机数写入图像文件 /// </summary> /// <param name="code">code是一个随机数</param> public static MemoryStream CreateImage(out string code) { code = GetVerifyCode(); Bitmap Img = null; Graphics g = null; MemoryStream ms = null; Random random = new Random(); //验证码颜色集合 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //验证码字体集合 string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" }; //定义图像的大小,生成图像的实例 Img = new Bitmap(((int)code.Length) * 16, 32); g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象 g.Clear(Color.White);//背景设为白色 //在随机位置画背景点 for (int i = 0; i < 100; i++) { int x = random.Next(Img.Width); int y = random.Next(Img.Height); g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); } //验证码绘制在g中 for (int i = 0; i < code.Length; i++) { int cindex = random.Next(7);//随机颜色索引值 int findex = random.Next(5);//随机字体索引值 Font f = new Font(fonts[findex], 15, FontStyle.Bold);//字体 Brush b = new SolidBrush(c[cindex]);//颜色 int ii = 4; if ((i + 1) % 2 == 0)//控制验证码不在同一高度 { ii = 2; } g.DrawString(code.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符 } ms = new MemoryStream();//生成内存流对象 Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中 //回收资源 g.Dispose(); Img.Dispose(); return ms; } } 新建一个页面VerifyCodeImage.aspx共前台调用using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class VerifyCodeImage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string verifyCode = String.Empty; MemoryStream memoryStream = VerifyCode.CreateImage(out verifyCode); Response.ContentType = "image/jpeg"; Response.Cookies.Add(new HttpCookie("VerifyCode", verifyCode)); Response.BinaryWrite(memoryStream.ToArray()); } }调用页面<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent"> <img src="/VerifyCodeImage.aspx" id="verifyCode"/> </asp:Content>实现验证实现验证也很简答,把验证码写入cookie,用户点击登陆的时候只需要与cookie的值进行比较即可。
2018年03月10日
1,082 阅读
0 评论
1 点赞
2018-03-10
使用Request获取浏览器以及操作系统信息
string name = Request.Browser.Browser; string type = Request.Browser.Type; string version = Request.Browser.Version; string os = Request.Browser.Platform; string isSupportFramework = Request.Browser.Frames.ToString(); string isSupportTable = Request.Browser.Tables.ToString(); string isSupportCookie = Request.Browser.Cookies.ToString(); string strInfo = name + "<br/>" + type + "<br/>" + version+"<br/>"+os+"<br/>"+isSupportFramework; Response.Write(strInfo);
2018年03月10日
1,280 阅读
0 评论
0 点赞
2018-03-10
由于先前已在此页中指定了另一种语言(或者由 CodeFile 特性暗示),因此无法使用“javascript”。
其实我没学过Asp.Net,之前一直都是html的,最近公司一直再用aspx的东西,所以特地学习以下。错误代码如下<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script language="javascript" type="text/javascript" runat="server"> function btnRed_onClick() { form1.style.backgroundColor = "Red"; } </script> </head> <body> <form id="form1" runat="server"> <div> <input type="button" value="red" onclick="return btnRed_onClick()" /> </div> </form> </body> </html> 解决方法去掉<script language="javascript" type="text/javascript" runat="server">中的runat="server"因为<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>指定了在服务器端执行的是C#语言,<script language="javascript" type="text/javascript" runat="server">想在服务器端执行,显然是不行的。
2018年03月10日
1,110 阅读
0 评论
0 点赞
2018-01-18
JavaScript结合.Net实现base64加、解密
主要解决问题,客户端通过utf8进行base64加密后,将加密后的信息传送到服务端,服务端对加密后的信息进行解密,获取明文。JavaScript加密、解密代码function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/="; // public method for encoding this.encode = function(input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = _utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); } return output; } // public method for decoding this.decode = function(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = _utf8_decode(output); return output; } // private method for UTF-8 encoding _utf8_encode = function(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; } // private method for UTF-8 decoding _utf8_decode = function(utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } }通过Ajax将密文传送到服务端,服务端对密文进行解密.net代码#region 5.0 Base64加密 需指定编码 + static string Base64Encrypt(string source, Encoding encode) /// <summary> /// 5.0 Base64加密 需指定编码 /// </summary> /// <param name="strData"></param> /// <param name="encod"></param> /// <returns></returns> public static string Base64EncryptByEncode(string source, Encoding encode) { return Convert.ToBase64String(encode.GetBytes(source)); } #endregion #region 5.1 Base64解密 需指定编码 + static string Base64Decrypt(string source, Encoding encode) /// <summary> /// 5.1 Base64加密 需指定编码 /// </summary> /// <param name="strData"></param> /// <param name="encod"></param> /// <returns></returns> public static string Base64DecryptByEncode(string source, Encoding encode) { return encode.GetString(Convert.FromBase64String(source)); } #endregion #region 5.2 Base64加密(默认UTF8编码) + static string Base64Encrypt(string source) /// <summary> /// 5.2 Base64加密 /// </summary> /// <param name="strData"></param> /// <returns></returns> public static string Base64Encrypt(string source) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(source)); } #endregion #region 5.3 Base64解密 + static string Base64Decrypt(string source) /// <summary> /// 5.3 Base64加密(默认UTF8编码) /// </summary> /// <param name="strData"></param> /// <param name="encod"></param> /// <returns></returns> public static string Base64Decrypt(string source) { return Encoding.UTF8.GetString(Convert.FromBase64String(source)); } #endregion
2018年01月18日
1,356 阅读
0 评论
0 点赞
2017-12-08
ASP.NET MVC客户端及服务端验证
在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证;我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解(System.ComponentModel.DataAnnotations命名空间下的一组类)进行解析,实现前端、后端的数据验证;其实客户端验证也是调用的jquery.validate.js,我个人觉得,通过数据注解,服务端的验证确实能够方便不少,但是客户端的验证,感觉还不如直接用jquery.validate来的方便。数据注解以及微软内置的验证这里就不多介绍了,这里我们主要介绍一下如何实现服务端和客户端自定义验证前期准备代码,实体类、控制器、视图实体类using me.lisen.MVC.Public; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace me.lisen.MVC.Models { public class Product { [Key] public string ID { get; set; } [Display(Name="产品名称")] [Required(ErrorMessage ="请输入产品名称")] [StringLength(2,ErrorMessage ="最多输入两个字符")] public string Name { get; set; } [Display(Name ="价格")] [Required(ErrorMessage ="请输入价格")] [PriceValid(MinPrice =20.00,ErrorMessage ="价格不能低于20元")] public Decimal Price { get; set; } } }控制器using me.lisen.MVC.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace me.lisen.MVC.Controllers { public class ProductController : Controller { // GET: Product public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Product product) { if (ModelState.IsValid) { return RedirectToAction("Create"); } return View(); } } }视图@model me.lisen.MVC.Models.Product @{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Product</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div>服务端验证实现自定义的服务端验证非常简单,我们只需要继承ValidationAttribute类,然后重写IsValid()方法即可using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; using System.Web.Mvc; namespace me.lisen.MVC.Public { public class PriceValid:ValidationAttribute { public double MinPrice { get; set; } public override bool IsValid(object value) { if (value == null) { return true; } var price = Convert.ToDouble(value); if(price < MinPrice) { return false; } return true; } } }返回true或false代表验证是否通过。客户端验证自定义客户端验证就比较繁琐了,我们需要实现IClientValidatable接口的, public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context )方法,然后在方法中定义传递给js的方法名以及方法参数。实现接口IClientValidatableusing System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; using System.Web.Mvc; namespace me.lisen.MVC.Public { public class PriceValid:ValidationAttribute,IClientValidatable { public double MinPrice { get; set; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = metadata.GetDisplayName() + "不能小于系统限制"; rule.ValidationParameters.Add("minprice", MinPrice); rule.ValidationType = "price"; yield return rule; } public override bool IsValid(object value) { if (value == null) { return true; } var price = Convert.ToDouble(value); if(price < MinPrice) { return false; } return true; } } }添加js文件/* 第一个参数是服务端ValidationType值 第二个参数必须是ValidationParameters.Add()的值 */ $.validator.unobtrusive.adapters.addSingleVal("price", "minprice"); $.validator.addMethod("price", function (value, element, param) { if (value) { var inputValue = parseInt(value, 10); var validateValue = parseInt(param, 10); if (inputValue < validateValue) { return false; } } return true; });页面引入js文件
2017年12月08日
1,504 阅读
2 评论
2 点赞
2017-12-06
asp.net mvc area区域
Area可以在原来的MVC项目中开辟一块单独的区域放置功能模块。独立出来的区域可以包含专用的M-V-C功能,也可以包含独立的路由和视图引擎。这里我们主要针对区域的创建以及区域相互调用还有路由限制进行简答的说明。创建MVC项目后,会包含一个HomeController,这里我们为了演示,在建立一个名为Home的区域。路由冲突Area创建完成后,如果我们直接访问,会提示找到多个与名为“Home”的控制器匹配的类型。如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配的控制器,则会发生这种情况。如果是这样,请通过调用带有 'namespaces' 参数的 "MapRoute" 方法的重载来注册此路由。出现这个的原因,是我们区域中的路由跟外部HomeController的路由发生了冲突,为了解决这个问题,我们必须对路由匹配规则进行限制。路由限制路由限制的方式由很多种,可以限制controller或者action等等,这里我们通过限制HomeController的命名空间来进行限制。打开App_Start文件夹,找到RouteConfig.cs文件,修改RegisterRoutes方法如下public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "me.lisen.WebUI.Controllers" } ); }修改完成后,我们再次打开运行项目发现能正常打开了通过routedebugger,我们可以看到首页匹配到了Home/Index上面区域相互访问创建完区域之后,我们可以外部需要访问内部区域,或者内部访问外部区域,这个可以通过便签助手,增加area属性解决。比如我们外部需要访问内部Home区域,只需要在标签助手在区域即可<a href="@Url.Action("Index","Home",new { area="Home"})">前往内部首页</a> 如果需要内部区域访问外部区域,将area设置成""即可<a href="@Url.Action("Index","Home",new { area=""})">前往外部首页</a> 温馨提示统一区域内相互访问时,不需要加area属性。
2017年12月06日
1,477 阅读
0 评论
1 点赞
2017-12-06
ASP.NET MVC使用Ninject
本文主要介绍的是通过构造函数加上配置文件的形式,完成注入工作。当然网上很多人也说不依赖XML是Ninject的一大优点,这里我也仅仅是进行演示,大家可以通过bind-to的方式直接进行的。安装NugetNuget的安装这里就不多介绍了,本文使用的Nuget包如下Ninject Ninject.Extensions.Xml温馨提示如果使用XML加载的方式,必须添加Ninject.Extensions.Xml包Ninject注入我们继承DefaultControllerFactory创建NinjectControllerFactory,代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Ninject; using System.Web.Mvc; using me.lisen.Db.CustomerDb; using System.Web.Routing; using System.Web; namespace me.lisen.Util.Loc { public class NinjectControllerFactory : DefaultControllerFactory { IKernel kernel; public NinjectControllerFactory() { kernel = new StandardKernel(); AddBinding(); } protected override IController GetControllerInstance(RequestContext context,Type controllerType) { return controllerType == null ? null : (IController)kernel.Get(controllerType); } public void AddBinding() { kernel.Load(HttpContext.Current.Server.MapPath(".")+"\\XmlConfig\\Ninject.xml"); //kernel.Bind<ICustomerDb>().To<CustomerDb>(); } } }创建接口和实现类,具体代码如下using me.lisen.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace me.lisen.Db.CustomerDb { public interface ICustomerDb { List<Customer> GetCustomers(); List<Customer> GetCustomers(string whereKey, string whereValue); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using me.lisen.Models; using Ninject; using System.Data.Entity; namespace me.lisen.Db.CustomerDb { public class CustomerDb : ICustomerDb { private readonly NorthwindContext context; [Inject] public CustomerDb() { context = new NorthwindContext(); } public List<Customer> GetCustomers() { return context.Customers.ToList<Customer>(); } public List<Customer> GetCustomers(string whereKey, string whereValue) { return context.Customers.Where(e => e.ContactName == whereValue).ToList<Customer>(); } } }修改Global.asax中Application_Start方法,添加以下代码ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 使用我们通过构造函数调用,修改控制器构造函数private readonly ICustomerDb customerDb; public CustomerController(ICustomerDb customerDb) { this.customerDb = customerDb; }xml文件配置<module name="Db"> <bind service="me.lisen.Db.CustomerDb.ICustomerDb,me.lisen.Db" to="me.lisen.Db.CustomerDb.CustomerDb,me.lisen.Db"></bind> </module>
2017年12月06日
1,383 阅读
0 评论
1 点赞
2017-11-29
asp.net core中bootstrap-table无法获取返回的Json数据
之前在ASP.NET Core下面,通过bootstrap-table也展示过数据,当时也是在controller中直接返回了Json对象,当时没有任何问题,但是今天测试的时候,发现返回的数据不能展示了,所有的数据都变成了 -,其实就是数据有问题,但是查看返回的Json数据的时候,Json数据格式也没有任何问题。处理Json返回的数据更多调试发现,Json对象还有一个JsonSerializerSettings参数的重载函数,然后直接实例化了一个JsonSerializerSettings对象,然后返回Json就可以了,具体如下var rows = productHelper.GetProductPager(limit, offset); int total = rows.Count(); JsonSerializerSettings settings = new JsonSerializerSettings(); //settings.MaxDepth = 50; //settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //设置不处理循环引用 //转成Json格式 return Json(new { total = total, rows = rows }, settings); //return Json(new { total = total, rows = rows });
2017年11月29日
1,534 阅读
0 评论
22 点赞
2017-11-25
ASP.NET Core ISession找不到SetString方法
不得不感叹一下,现在ASP.NET Core的资料实在是太少了,官网的文档看着也混乱。有时候遇到点问题都找不到解决方案,网上的文章也基本是一人发表,全网来抄。DoNetCore默认的Session只能写入byte数组,为了能够调用SetString()方法,我们还需要安装如下的Nuget包Microsoft.AspNetCore.Http.Extensions这个当时郁闷了好久,就是找不到SetString()方法,大家如果碰到的,也看一下是不是缺少包
2017年11月25日
1,607 阅读
2 评论
2 点赞
2017-09-23
ASP.NET Core WebApi配置跨域访问
WebApi如果没有正确配置跨域访问,会提示Preflight response is not successful在asp.net core中,我们可以通过startup.cs配置跨域问题配置startup.csservices.AddCors(options=>{ options.AddPolicy("any",builder=>{ builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); });配置controller除了配置startup.cs允许跨域外,我们还需要在controller方法中增加[EnableCors("any")]属性[HttpGet] [Produces("application/json")] [EnableCors("any")] public JsonResult Get() { return Json(_service.Get()); }ajax调用配置完成后,我们就可以通过ajax调用$(function(){ $.ajax({ url:"http://localhost:5000/Product", type:"get", contentType: 'application/json', success:function(data){ var obj = data; var str=""; for(var i=0;i<obj.length;i++){ str+="<li>"+obj[i].name+"</li>"; } $("#div1").append(str); } }); });
2017年09月23日
1,296 阅读
0 评论
2 点赞
2017-09-18
ASP.NET Core读取XML文件
ASP.NET Core中,默认应用程序的配置是json文件,如果我们需要读取xml文件,是否也可以呢?答案是肯定的。其实读取xml文件的方式,跟读取json的方式基本是一样的,都可以通过Configuration读取。定义XML文件首先,我们定义个XML文件,这里我们命名为appsettings.xml,具体的内容如下:<?xml version="1.0" encoding="UTF-8" ?> <AppConfig> <WebSite> <Url des="网址">lisen.cc</Url> <Email>admin@lisen.org</Email> </WebSite> </AppConfig>修改配置文件程序如果不配置,默认读取的是appsettings.json或者appsettings.Development,我们需要修改程序,读取xml的配置文件。打开program.cs文件,修改内容如下using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Builder; namespace Study.WebUI { public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseConfiguration(new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile("appsettings.xml").Build()) .UseKestrel(options => { options.Limits.MaxConcurrentConnections = 1024; options.Limits.MaxRequestBodySize = 10 * 1024; }) .Build(); } }安装Nuget包为了读取xml文件,我们需要安装Microsoft.Extensions.Configuration.Xml使用以下代码分别演示读取xml节点的属性以及值得方法app.Use(async (context,next) => { Console.WriteLine("网址:"+Configuration["WebSite:Url:des"]);//读取属性 Console.WriteLine("邮箱:"+Configuration["WebSite:Email"]);//读取节点内容 await next.Invoke(); });温馨提示读取xml不需要最外层跟节点,否则会返回null
2017年09月18日
1,708 阅读
0 评论
2 点赞
2017-09-05
ASP.NET CORE中URL的重写和重定向
URL的重写和重定向我们还是比较经常用的,不管我们做301跳转还是防盗链亦或是进行SEO,我们都经常使用到URL的重写或者重定向。我本人也是做ERP的,所以业务系统使用的这些功能相对来说比较少,我也只是参考https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/url-rewriting?tabs=aspnetcore2x进行学习,有不足的地方大家多多指教。重定向不管是重定向还是重写,我们都需要在startup.cs中调用UseRewriter()中间件。UseRewriter()方法需要一个RewriteOptions参数,这个类位于Microsoft.AspNetCore.Rewrite命名空间。我们按照如下方式配置重定向,第一个参数是正则表达式,第二个是要跳转的位置,第三个是跳转状态,默认是302,这里我们可以改成301var options = new RewriteOptions() .AddRedirect(@"index/(\d+)", "https://lisen.cc/", 301); app.UseRewriter(options);这样配置按成后,所有方位/index/*下面的地址都讲跳转到我的博客地址。同样的,我们可以通过.AddRedirectToHttps(301,443)讲http跳转到https,第一个是状态,一般使用301永久跳转,第二个是https的端口号。也可以通过.AddRedirectToHttpsPermanent()通过301跳转到443端口重写.AddRewrite(@"^index1/(\d+)", "https://lisen.cc/", skipRemainingRules: true);方法是实现URL重写,第一个参数同样是正则表达式,第二个是要跳转的位置,第三个参数代表是否忽略其他的规则。通过读取Apache配置文件实现重写通过.AddApacheModRewrite(apacheModRewriteStreamReader);可以读取Apache的伪静态规则首先,我们需要创建一个Apache的伪静态规则的txt文件ApacheModRewrite.txt \# Rewrite path with additional sub directory RewriteRule ^/apache-mod-rules-redirect/(.*) https://lisen.cc/ [L,R=302]然后配置startup.cs,如下 using(StreamReader apacheModRewriteStreamReader=new StreamReader("ApacheModRewrite.txt")) using(StreamReader iisUrlRewriteStreamReader=new StreamReader("iisUrlRewrite.txt")) { var options = new RewriteOptions() //.AddRedirect("index1/(.*)","https://lisen.cc/",301) .AddApacheModRewrite(apacheModRewriteStreamReader); //.AddRewrite(@"^index1/(\d+)", "https://lisen.cc/", skipRemainingRules: true); app.UseRewriter(options); }IIS重写配置文件iisUrlRewrite.xml如下<rewrite> <rules> <rule name="Rewrite segment to id querystring" stopProcessing="true"> <match url="^iis-rules-rewrite/(.*)$" /> <action type="Rewrite" url="https://lisen.cc/" appendQueryString="false"/> </rule> </rules> </rewrite> using(StreamReader apacheModRewriteStreamReader=new StreamReader("ApacheModRewrite.txt")) using(StreamReader iisUrlRewriteStreamReader=new StreamReader("iisUrlRewrite.xml")) { var options = new RewriteOptions() //.AddRedirect("index1/(.*)","https://lisen.cc/",301) .AddIISUrlRewrite(iisUrlRewriteStreamReader) .Add(RewriteMapSegment; //.AddRewrite(@"^index1/(\d+)", "https://lisen.cc/", skipRemainingRules: true); app.UseRewriter(options); }
2017年09月05日
1,522 阅读
0 评论
0 点赞
1
2