C#之浏览器请求跨域

来源:互联网 发布:java微商城源码下载 编辑:程序博客网 时间:2024/05/21 15:44

1 现象

需求:A项目的页面需要调用B项目的接口(接口项目)并获取响应的数据。

方法:所以在A项目的页面中使用AJAX直接调用对应的接口获取数据。
问题:浏览器使用AJAX请求非本项目的接口是存在跨域问题。
截图:

2 解决

方法:在A项目中创建一个.ashx文件(一般处理程序),作为通讯层,接收页面请求,
然后将请求转发给B项目,在获取B项目的返回值后,将返回值发给页面。

3 代码

A项目的通讯层代码
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;using System.IO;namespace LY.DRCM.WEBSITE.Handler{    /// <summary>    /// DataHandler 的摘要说明    /// </summary>    public class DataHandler : IHttpHandler    {        public void ProcessRequest(HttpContext context)        {            HttpResponse hResponse = context.Response;//HTTP响应消息            HttpRequest hRequest = context.Request;//HTTP请求消息            string param = (string)hRequest["param"];//获取请求参数                        //创建http请求            string url = "http://localhost:38193/Handler.ashx?param=" + param;            //发送请求            WebRequest request = HttpWebRequest.Create(url);            //设置为POST请求            request.Method = "POST";            //获取响应对象            WebResponse response = request.GetResponse();            Stream responeBody = response.GetResponseStream();            using (StreamReader reader = new StreamReader(responeBody))            {                result = reader.ReadToEnd();            }            context.Response.ContentType = "text/plain";            context.Response.Clear();            context.Response.Write(result);            context.Response.End();        }        public bool IsReusable        {            get            {                return false;            }        }    }}

代码分析:
HttpRequest类:使ASP.NET能够读取客户端在Web请求期间发送的HTTP值。
WebRequest类:发出对统一资源标识符(URL)的请求。这是一abstract类。
Stream类:流。
StreamReader类:实现一个TextReader,使其以一种特定的编码从字节流中读取字符。

A项目通讯层代码-使用POST:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;using System.IO;namespace LY.DRCM.WEBSITE.Handler{    /// <summary>    /// DataHandler 的摘要说明    /// </summary>    public class DataHandler : IHttpHandler    {        public void ProcessRequest(HttpContext context)        {            HttpRequest hRequest = context.Request;//HTTP请求消息            string param = (string)hRequest["param"];//获取请求参数            //发送POST请求            string url = "http://localhost:38193/Handler.ashx";            WebRequest request = HttpWebRequest.Create(url);            request.Method = "POST";            StreamWriter myStreamWriter = new StreamWriter(request.GetRequestStream());            myStreamWriter.Write(param);            myStreamWriter.Close();            //获取响应对象            HttpWebResponse response = (HttpWebResponse)request.GetResponse();            StreamReader myStreamReader = new StreamReader(response.GetResponseStream());            string resultResponse = myStreamReader.ReadToEnd();            myStreamReader.Close();            //输出响应结果            context.Response.ContentType = "text/plain";            context.Response.Clear();            context.Response.Write(resultResponse);            context.Response.End();        }        public bool IsReusable        {            get            {                return false;            }        }    }}



0 0