现在技术开发偏向于使用统一的接口处理浏览器或者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)的更多相关文章

  1. 前端跨域方案-跨域请求代理(node服务)

    前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...

  2. 前端总结·基础篇·JS(四)异步请求及跨域方案

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

  3. vue-cli 3.0之跨域请求代理配置及axios路径配置

    vue-cli 3.0之跨域请求代理配置及axios路径配置 问题:在前后端分离的跨域请求中,报跨域问题 配置: vue.config.js: module.exports = { runtimeCo ...

  4. vue.js学习之 跨域请求代理与axios传参

    vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{}, ...

  5. 跨域GET、POST请求

    跨域GET.POST请求的小结 重点:跨域POST大量数据: JQuery:$.ajax/$.getJSON支持jsonp格式的跨域,但是只支持GET方式,暂不支持POST: CORS:w3c关于跨域 ...

  6. Angular通过CORS实现跨域方案

    以前有一篇很老的文章网上转了很多,包括现在如果你百度"跨域"这个关键字,前几个推荐的都是"Javascript跨域总结与解决方案".看了一下感觉手段有点陈旧了, ...

  7. SSO的几种跨域方案

    在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...

  8. Web 前端必备的各种跨域方式汇总

    Web 前端必备的各种跨域方式汇总 跨域方式汇总 同源策略 协议相同 + 域名相同 + 端口相同 https://www.xgqfrms.xyz/index.html https://www.xgqf ...

  9. 前后端分离框架前端react,后端springboot跨域问题分析

    前后端分离框架前端react,后端springboot跨域问题分析 为啥跨域了 前端react的设置 springboot后端设置 为啥跨域了 由于前后端不在一个端口上,也是属于跨域问题的一种,所以必 ...

  10. JSONP跨域的script标签请求为什么不受同源策略的限制?

    在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...

随机推荐

  1. Qt编写地图综合应用36-覆盖物折线

    一.前言 折线图目前应用最广的也是用来绘制各种轨迹,折线图其实就是后面动态轨迹图.飞机航线图的前身,公用的一个方法addPolyline,折线图可以设置颜色.粗细.透明度等属性,如果开启了悬浮绘图工具 ...

  2. Qt编写安防视频监控系统27-GPU显示

    一.前言 之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv.dxva2.d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了, ...

  3. Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files (x86)\目录下安装编译好的静态库(.lib)和动态链接库(.dll)时的步骤和注意事项

    从CMake构建和编译第三方依赖库的步骤: 1.下载第三方依赖库的源码,并解压到指定的目录中. 2.在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build. 3.打开CMa ...

  4. error LNK2038: 检测到“_MSC_VER”的不匹配项问题

    _MSC_VER这个相当于做了宏的检测 _MSC_VER 定义编译器的版本. 一些编译器版本的_MSC_VER值:MS VC++ 14.0 _MSC_VER = 1900 vs2015MS VC++ ...

  5. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-9- 浏览器的相关操作 (详细教程)

    1.简介 在自动化测试领域,元素定位是非常重要的一环.正确定位页面元素是测试用例能否成功执行的关键因素之一.playwright是一种自动化测试工具,它提供了丰富的元素定位方法,可以满足不同场景下的定 ...

  6. CDS标准视图:维修工单实际成本数据 I_MaintOrderActualCostDataCube

    视图名称:维修工单实际成本数据 I_MaintOrderActualCostDataCube 视图类型:基础 视图代码: 点击查看代码 @VDM.viewType: #COMPOSITE @AbapC ...

  7. UWP Shadow 阴影

    参考文字: https://mtaulty.com/2016/08/10/windows-10-uwp-and-composition-light-and-shade/ <Grid Backgr ...

  8. Shiftdel walkthrough Intermediate

    点击查看代码 nmap -p- -A 192.168.167.174 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-12 00:09 UT ...

  9. 自定义swagger扩展解析jsondoc

    需求规定 为了减少注释和swagger注解的重复定义, 通过规范注释, 让swagger可以通过javadoc来产生 替换@Api.@ApiOperation.@ApiModel.@ApiModelP ...

  10. CPU算力如何计算

    本文分享自天翼云开发者社区<CPU算力如何计算>,作者:l****n 什么是算力 随着国家大力发展数字基础设施,算力的提升和普惠变得越来越重要,它注定会在人们的视线中占据很重要的一席.那么 ...