现在技术开发偏向于使用统一的接口处理浏览器或者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. 黑苹果(Hackintosh) - 问题,修改CPU数量和内存数量后,系统重启失败

    1. 问题复现 安装完黑苹果后,内存默认的 1个处理器2个核心.2G内存,发现不够用. 于是,修改了 VMware 对此系统的 硬件配置 内存: 2G -> 8G 处理器:1个处理器 -> ...

  2. 2019.12.10笔记——Spring Boot热部署的使用和实现自己的热部署(类加载器相关)

    Spring Boot热部署 热部署的使用 引入依赖 <!-- spring boot热部署的依赖 --> <dependency> <groupId>org.sp ...

  3. Eureka 缓存机制详细配置

    https://blog.csdn.net/qwe86314/article/details/94963865 上节为大家介绍了 Eureka 的工作原理,其中提到了 Eureka Server 内部 ...

  4. Qt开发经验小技巧226-230

    qtc开发工具内置了不少的函数,可以很方便的进行一些判断和处理. //最小版本要求 !minQtVersion(5, 15, 2) { message("Cannot build Qt In ...

  5. 记一次简单的存储过程和Pivot行转列

    首先我很讨厌写存储过程,其次我很讨厌 没办法,主要是需要进行 行转列,项目经理说可以用Pivot.我不是很精通sql,但是我会百度呀~ pivot需要有确定的列名.那我这个项目里面没办法确定,最后问了 ...

  6. CDS标准视图:有技术对象的维修工单 I_MAINTORDERTECHOBJCUBE

    视图名称:有技术对象的维修工单 I_MAINTORDERTECHOBJCUBE 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Order ...

  7. 如何快速的开发一个完整的iOS直播app(创建房间)

    直播(创建房间) 1.进入主播界面,首先创建房间 2.设计房间模型(key,名称),key作为房间的唯一标识,用来找到房间 3.用socket创建房间,导入socket.io框架 4.一般一个客户端一 ...

  8. UML的9种常用图与建模工具详解

    UML即Unified Model Language,是一种建模语言,也是标准建模语言.在软件开发中,当系统规模比较复杂时,需要用图形抽象地来表达复杂的概念,让整个软件设计更具有可读性,可理解性,以便 ...

  9. Kotlin:【set集合】集合创建、可变集合mutableSetOf、集合转换(List转换成Set,去掉重复元素)、distinct快捷去重函数、数组

  10. Collection子接口:Set接口(实现类:HashSet、LinkedHashSet、TreeSet)

    /** * 1. Set接口的框架: * * |----Collection接口:单列集合,用来存储一个一个的对象 * |----Set接口:存储无序的.不可重复的数据 -->高中讲的" ...