前端跨域方案-跨域请求代理(asp.net handler)
现在技术开发偏向于使用统一的接口处理浏览器或者app的http请求。
大家都知道因为浏览器的同源策略的原因 js直接请求webapi 接口会有一些问题,即使做好服务器端的配置 同样会有不少的 问题 并且会有浏览器的兼容性 而使用jsonp 又需要服务器端对返回数据做相关处理 所以考虑考虑使用代理来解决前端跨域请求的问题。
代理程序走asp.net的一般处理程序,来实现前端js请求的接受然后转发到api站点。

关键点:
1.使用url参数的方式传送api接口的站点路径
http://test.m.***.com/handler/api.ashx?apipath=api/ArticlesApi/getlist
2.读取url参数追加到接口请求中(注意把apipath参数过滤掉)
3.读取post请求中的请求体中的json数据 放到接口的请求中
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web; namespace m.lingfo.com.handlers
{
/// <summary>
/// api 的摘要说明
/// </summary>
public class api : IHttpHandler
{ string domain = "localapi.***.com";
public void ProcessRequest(HttpContext context)
{
string url = "http://localapi.***.com";
string IsDebug = ConfigurationManager.AppSettings["IsDebug"];
if (Convert.ToBoolean(IsDebug))
{
url = ConfigurationManager.AppSettings["localapi"];
}
else
{
url = ConfigurationManager.AppSettings["siteapi"];
} //获取请求的url参数
string baseurl;
NameValueCollection nvc = ParseUrl(context.Request.RawUrl, out baseurl);
StringBuilder sb = new StringBuilder();
foreach (var item in nvc.AllKeys)
{
if (item.Equals("apipath"))
{
continue;
}
sb.AppendFormat("&{0}={1}",item,nvc[item]);
}
string json = "{\"name\":\"aa\",\"mobile\":\"130\"}";
string Path = string.Format("{0}/{1}",url,nvc["apipath"]);//url中追加的apipath参数 作为接口的唯一地址标识
WebRequest request = WebRequest.CreateHttp(Path);
request.Method = context.Request.HttpMethod;
request.ContentType = "application/json";
//获取请求的Form数据
NameValueCollection nvc2 = context.Request.Form;
if (!context.Request.HttpMethod.ToLower().Equals("get"))
{
JObject formdata = new JObject();
foreach (var item in nvc2.AllKeys)
{
formdata[item] = nvc2[item];
}
json = JsonConvert.SerializeObject(formdata);
if (!string.IsNullOrEmpty(json))
{
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
} System.Net.WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
string ReturnVal = reader.ReadToEnd();
reader.Close();
response.Close();
context.Response.ContentType = "application/json";
context.Response.Write(ReturnVal);
context.Response.End();
}
/// <summary>
/// 分析url链接,返回参数集合
/// </summary>
/// <param name="url">url链接</param>
/// <param name="baseUrl"></param>
/// <returns></returns>
private static System.Collections.Specialized.NameValueCollection ParseUrl(string url, out string baseUrl)
{
baseUrl = "";
if (string.IsNullOrEmpty(url))
return null;
System.Collections.Specialized.NameValueCollection nvc = new System.Collections.Specialized.NameValueCollection(); try
{
int questionMarkIndex = url.IndexOf('?'); if (questionMarkIndex == -1)
baseUrl = url;
else
baseUrl = url.Substring(0, questionMarkIndex);
if (questionMarkIndex == url.Length - 1)
return null;
string ps = url.Substring(questionMarkIndex + 1); // 开始分析参数对
System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(@"(^|&)?(\w+)=([^&]+)(&|$)?", System.Text.RegularExpressions.RegexOptions.Compiled);
System.Text.RegularExpressions.MatchCollection mc = re.Matches(ps); foreach (System.Text.RegularExpressions.Match m in mc)
{
nvc.Add(m.Result("$2").ToLower(), m.Result("$3"));
} }
catch { }
return nvc;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
最后在分享下自己的一个前端请求代理接口的例子(封装成了jQuery插件):
$.dyiajax = function (apipath, data, ajaxtype, success, fail) {
var url = "/handlers/api.ashx?apipath=" + apipath;
$.ajax({
url: url,
type: ajaxtype,
dataType: 'json',
data: data,
success: success,
fail: fail
});
}
//调用例子
$.dyiajax("/api/ArticlesApi/downrecommendlist?time=" + time + "&length=10", {},"get", function (data) {}, function () {});
现在技术上要求前后端分离 不能要求前端开发人员都能搭建 vs环境 所以 又写了一个 node的代理服务 这样的话前端开发人员只需要在本地启动node服务做为服务器 然后实现请求。
前端跨域方案-跨域请求代理(asp.net handler)的更多相关文章
- 前端跨域方案-跨域请求代理(node服务)
前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...
- 前端总结·基础篇·JS(四)异步请求及跨域方案
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- vue-cli 3.0之跨域请求代理配置及axios路径配置
vue-cli 3.0之跨域请求代理配置及axios路径配置 问题:在前后端分离的跨域请求中,报跨域问题 配置: vue.config.js: module.exports = { runtimeCo ...
- vue.js学习之 跨域请求代理与axios传参
vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{}, ...
- 跨域GET、POST请求
跨域GET.POST请求的小结 重点:跨域POST大量数据: JQuery:$.ajax/$.getJSON支持jsonp格式的跨域,但是只支持GET方式,暂不支持POST: CORS:w3c关于跨域 ...
- Angular通过CORS实现跨域方案
以前有一篇很老的文章网上转了很多,包括现在如果你百度"跨域"这个关键字,前几个推荐的都是"Javascript跨域总结与解决方案".看了一下感觉手段有点陈旧了, ...
- SSO的几种跨域方案
在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...
- Web 前端必备的各种跨域方式汇总
Web 前端必备的各种跨域方式汇总 跨域方式汇总 同源策略 协议相同 + 域名相同 + 端口相同 https://www.xgqfrms.xyz/index.html https://www.xgqf ...
- 前后端分离框架前端react,后端springboot跨域问题分析
前后端分离框架前端react,后端springboot跨域问题分析 为啥跨域了 前端react的设置 springboot后端设置 为啥跨域了 由于前后端不在一个端口上,也是属于跨域问题的一种,所以必 ...
- JSONP跨域的script标签请求为什么不受同源策略的限制?
在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...
随机推荐
- 强化学习:使用自动控制方法PID来解决强化学习问题中的cartpole问题(小车平衡杆问题)
网上找到的一个实现: 地址: https://gist.github.com/HenryJia/23db12d61546054aa43f8dc587d9dc2c 稍微修改后的代码: import nu ...
- 【Web前端】【JavaScript】实现表格隔行变色
方法1:原生JavaScript 设置CSS table td{ border:red solid 1px; } .tr1{ color:white; background: black; } .tr ...
- pip 安装 Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)'))
1.问题 1.1 问题截取 pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple Looking in indexes: http ...
- [转]vue-router动态添加路由的方法,addRouter添加路由,提示:Duplicate named routes definition
问题描述:在做使用vue-router动态添加路由的方法,addRouter添加,使用 console.log(this.$router.options.routes) 打印对象,发现添加成功,但是一 ...
- springboot的yml文件中如何配置redis?
springboot的yml文件中如何配置redis? 解决方法: spring: #redis配置 redis: database: 0 timeout: 0 # Redis服务器地址 host: ...
- C#中定义类时关于CLSCompliant属性的声明
今天在做code analysis时,遇到了这个提示 Warning 1 CA1014 : Microsoft.Design : Mark 'Demo.exe' with CLSCompliant(t ...
- IM开发快速入门(二):什么是IM系统的实时性?
本文在编写时参考了博客作者"鹿呦呦"和在线课程"即时消息技术剖析与实战"的相关资料,一并表示感谢. 1.引言 随着移动互联网络的发展,IM技术的应用已经不仅限于 ...
- IM开发干货分享:万字长文,详解IM“消息“列表卡顿优化实践
本文由融云技术团队原创分享,原题"万字干货:IM "消息"列表卡顿优化实践",为使文章更好理解,内容有修订. 1.引言 随着移动互联网的普及,无论是IM开发者还 ...
- .Net Core 管道底层源码实现
在 .NET Core 中,请求处理管道是一个中间件(Middleware)链,用于处理 HTTP 请求并生成响应.管道的底层实现基于 Microsoft.AspNetCore.Http 命名空间中的 ...
- Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠
\(\mathscr{Description}\) Link. 有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\):有 \(m\) 只老鼠要吃奶酪, ...