开发微信大众号时前后端疏散,后台用C#开发,前端使用vue框架,数据给与axios传输
具体问题:
1:前后端疏散造成的跨域访谒问题
2:跨域后cookie传输和设置问题
解决方案:
1:使用jsonp作为数据传输的方法,前端和后端共同解决跨域问题
2:通过设置webconfig共同axios.js解决cookie传输(get、set)
具体方案:
问题一:
1:controller
/// <summary> /// get /// </summary> /// <param></param> /// <returns></returns> public JsonpResult Text(int ID) { return this.Jsonp(ID); } /// <summary> /// post /// </summary> /// <param></param> /// <returns></returns> [HttpPost] public JsonpResult TextJsonpHttp(string jsonp) { return this.Jsonp(jsonp); }
2:JsonpResult
/// <summary> /// Controller控制器类的扩展要领,即:Controller控制器下扩展一个Jsonp要领,这个要领带一个object类型的参数 /// </summary> public static class ControllerExtension { public static JsonpResult Jsonp(this Controller controller, object data) { JsonpResult result = new JsonpResult() { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; return result; } } public class JsonpResult : JsonResult { public static readonly string JsonpCallbackName = "MoDoPMS";//js中设置的jsonp public static readonly string CallbackApplicationType = "application/json"; public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new AccessViolationException("context"); } if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) //如果不允许来自客户真个Get请求,并且请求类型是Get { throw new AccessViolationException(); } var response = context.HttpContext.Response; if (!string.IsNullOrEmpty(ContentType)) //这个ContentType是获取或设置内容的类型。它是JsonResult类中的一个属性 { response.ContentType = ContentType; //设置响应内容的类型 } else { response.ContentType = CallbackApplicationType; //设置响应内容的类型 } if (ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding;//设置响应内容的编码 } if (Data != null) //这个Data是JsonResult类中的一个属性 { string buffer; var request = context.HttpContext.Request; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; if (request[JsonpCallbackName] != null) //获取回调函数名称 { buffer = String.Format("{0}({1})", request[JsonpCallbackName], JsonConvert.SerializeObject(Data, Formatting.None, settings));//首先按照callback获取获取函数名,然后传入json字符串作为函数参数 } else { buffer = JsonConvert.SerializeObject(Data, settings);//首先按照callback获取获取函数名,然后传入json字符串作为函数参数 } response.Write(buffer); } } }
View Code3:vue中axios.js