前端跨域方案-跨域请求代理(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属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...
随机推荐
- 搭建 zerotier 的行星服务
放弃moon节点,直接搭建Zerotier根服务器_软件应用_什么值得买 Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,ze ...
- AOP中动态代理详解
动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目 ...
- Docker学习笔记(一) - Docker安装
1.安装yum-utils yum install yum-utils device-mapper-persistent-data lvm2 复制 安装yum-utils是为方便添加yum源使用的,d ...
- ubuntu更换conda的源
ubuntu更换conda的源有两种方法:一.使用命令行更换Conda源至国内镜像站点.二.直接创建并编辑编辑conda的配置文件.condarc. 一.使用命令行更换Conda源至国内镜像站点 要在 ...
- 回顾 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报
前言 今天咱们一起来回顾一下 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报,看看是否有适合你学习和参考的项目和框架. 简报初衷 公众号每月定期推广和分享的C#/.NE ...
- C# 获取系统声卡音频数据,并绘制波形
//by wgscd //date:2022/11/7 UI: <Path Stroke="Red" Data="{Binding path}" Rend ...
- C# WebApi 全局配置模型验证和自定义错误处理。config Filters Add ModelStateValidationFilter/CustomExceptionFilter
public static void Start() { logger.Debug("Startup WebAPI..."); SwaggerConfig.Register(); ...
- springBoot(1)--初步理解
在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2)配置数据库连接.配置sprin ...
- shell脚本中的逻辑判断
shell脚本中也可以实现逻辑判断. 案例4:shell脚本中的逻辑判断 如果你学过C或者其他语言,相信你不会对if 陌生,在shell脚本中我们同样可以使用if逻辑判断.在shell中if判断的基本 ...
- Iterator迭代器接口(遍历Collection的两种方式之一)
使用 Iterator 接口遍历集合元素: Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素. GOF给迭代器模式的定义为:提供一种方法访问一个容 ...