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;
}
}
}
}