function getHello() {var xhr = new XMLHttpRequest();xhr.open("post", "http://b.example.com/Test.ashx", true);xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 声明请求源xhr.setRequestHeader("Origin", "http://a.example.com");xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {var responseText = xhr.responseText;console.info(responseText);}}xhr.send();} 服务端:public class Test : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/plain";// 声明接受所有域的请求context.Response.AddHeader("Access-Control-Allow-Origin", "*");context.Response.Write("Hello World");}public bool IsReusable{get{return false;}}}在Web API中启用跨域访问
然后在App_Start/WebApiConfig.cs进行如下配置即可实现跨域访问:
public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API 配置和服务// 将 Web API 配置为仅使用不记名令牌身份验证。config.SuppressDefaultHostAuthentication();config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });// 允许Web API跨域访问EnableCrossSiteRequests(config);config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));}private static void EnableCrossSiteRequests(HttpConfiguration config) {var cors = new EnableCorsAttribute(origins: "*",headers: "*",methods: "*");config.EnableCors(cors);}}由于IE10以下浏览器不支持CORS,所以目前在国内CORS并不是主流的跨域解决方案,但是随着windows 10的发布,IE的逐渐衰落,可以预见,在不远的将来CORS将成为跨域的标准解决方案。