关于WebAPI跨域的问题,网上已经很多了,以下方案可以解决很多跨域问题,但是都不支持IE8、IE9浏览器,JSONP也只能支持Get请求

  1. 通过dll配置 Install-Package Microsoft.AspNet.WebApi.Cors
  2. 配置 Web.config

IE8,IE9跨域是通过XDomainRequest这个对象去实现,和XMLHttpRequest类似,可以参考下面文档

https://msdn.microsoft.com/zh-cn/library/dd573303(v=vs.85).aspx

使用jQuery.ajax的基础上,在jQuery下面再引用

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/jQuery.XDomainRequest.js

这样IE8、IE9跨域成功了

        public Response<string> Post()
        {
            Response<string> rs = new Response<string>
            {
                head = new ResponseHeader { errcode = 0, errmessage = "post" },
                data = "hello"
            };
            return rs;
        }

这样IE8、IE9跨域失败了

        public Response<string> Post(Request<Message> request)
        {
            Response<string> rs = new Response<string>
            {
                head = new ResponseHeader { errcode = 0, errmessage = "post" },
                data = request.data.content
            };
            return rs;
        }

后来通过排查,有对象形参的WebAPI就会遇到反序列化问题,(IE8,IE9)转换为request对象的時候报错

试了很多次,前端帶不过來Content-Type,就想到了用參数传递到后端,也修改了jQuery.XDOmainRequest.js这个文件

  1 /*!
  2  * jQuery-ajaxTransport-XDomainRequest - v1.0.4 - 2015-03-05
  3  * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
  4  * Copyright (c) 2015 Jason Moon (@JSONMOON)
  5  * Licensed MIT (/blob/master/LICENSE.txt)
  6  */
  7 (function (factory) {
  8     if (typeof define === 'function' && define.amd) {
  9         // AMD. Register as anonymous module.
 10         define(['jquery'], factory);
 11     } else if (typeof exports === 'object') {
 12         // CommonJS
 13         module.exports = factory(require('jquery'));
 14     } else {
 15         // Browser globals.
 16         factory(jQuery);
 17     }
 18 }(function ($) {
 19 
 20     // Only continue if we're on IE8/IE9 with jQuery 1.5+ (contains the ajaxTransport function)
 21     if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) {
 22         return $;
 23     }
 24 
 25     var httpRegEx = /^(https?:)?\/\//i;
 26     var getOrPostRegEx = /^get|post$/i;
 27     var sameSchemeRegEx = new RegExp('^(\/\/|' + location.protocol + ')', 'i');
 28 
 29     // ajaxTransport exists in jQuery 1.5+
 30     $.ajaxTransport('* text html xml json', function (options, userOptions, jqXHR) {
 31 
 32         // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
 33         if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) {
 34             return;
 35         }
 36 
 37         var xdr = null;
 38 
 39         return {
 40             send: function (headers, complete) {
 41                 var postData = '';
 42                 var userType = (userOptions.dataType || '').toLowerCase();
 43 
 44                 xdr = new XDomainRequest();
 45                 if (/^\d+$/.test(userOptions.timeout)) {
 46                     xdr.timeout = userOptions.timeout;
 47                 }
 48 
 49                 xdr.ontimeout = function () {
 50                     complete(500, 'timeout');
 51                 };
 52 
 53                 xdr.onload = function () {
 54                     var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
 55                     var status = {
 56                         code: 200,
 57                         message: 'success'
 58                     };
 59                     var responses = {
 60                         text: xdr.responseText
 61                     };
 62                     try {
 63                         if (userType === 'html' || /text\/html/i.test(xdr.contentType)) {
 64                             responses.html = xdr.responseText;
 65                         } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) {
 66                             try {
 67                                 responses.json = $.parseJSON(xdr.responseText);
 68                             } catch (e) {
 69                                 status.code = 500;
 70                                 status.message = 'parseerror';
 71                                 //throw 'Invalid JSON: ' + xdr.responseText;
 72                             }
 73                         } else if (userType === 'xml' || (userType !== 'text' && /\/xml/i.test(xdr.contentType))) {
 74                             var doc = new ActiveXObject('Microsoft.XMLDOM');
 75                             doc.async = false;
 76                             try {
 77                                 doc.loadXML(xdr.responseText);
 78                             } catch (e) {
 79                                 doc = undefined;
 80                             }
 81                             if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
 82                                 status.code = 500;
 83                                 status.message = 'parseerror';
 84                                 throw 'Invalid XML: ' + xdr.responseText;
 85                             }
 86                             responses.xml = doc;
 87                         }
 88                     } catch (parseMessage) {
 89                         throw parseMessage;
 90                     } finally {
 91                         complete(status.code, status.message, responses, allResponseHeaders);
 92                     }
 93                 };
 94 
 95                 // set an empty handler for 'onprogress' so requests don't get aborted
 96                 xdr.onprogress = function () { };
 97                 xdr.onerror = function () {
 98                     complete(500, 'error', {
 99                         text: xdr.responseText
100                     });
101                 };
102 
103                 if (userOptions.data) {
104                     postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data);
105                 }
106                 if (options.contentType && options.contentType.length > 0) {
107                     if (options.url.indexOf('?') > -1) {
108                         options.url = options.url + '&_contentType=' + options.contentType;
109                     } else {
110                         options.url = options.url + '?_contentType=' + options.contentType;
111                     }
112                 }
113                 xdr.open(options.type, options.url);
114                 xdr.send(postData);
115             },
116             abort: function () {
117                 if (xdr) {
118                     xdr.abort();
119                 }
120             }
121         };
122     });
123 
124     return $;
125 
126 }));
jQuery.XDomainRequest.js

加上消息处理就可以解决

 public class CrossDomainFixIEHandler : DelegatingHandler
    {
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            if (request.Method == HttpMethod.Options)
            {
                HttpResponseMessage response = request.CreateResponse<string>(HttpStatusCode.OK, null);
                TaskCompletionSource<HttpResponseMessage> tcs = new TaskCompletionSource<HttpResponseMessage>();
                tcs.SetResult(response);
                return tcs.Task;
            }
            if (request.Content.Headers.ContentType == null || string.IsNullOrWhiteSpace(request.Content.Headers.ContentType.MediaType))
            {
                string contentType = this.GetContentType(string.Concat(request.RequestUri.Query, "&"));
                if (string.IsNullOrWhiteSpace(contentType))
                {
                    contentType = "application/json";
                }
                request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
            }
            return base.SendAsync(request, cancellationToken);
        }

        /// <summary>
        /// 獲取ContentType
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private string GetContentType(string source)
        {
            if (string.IsNullOrWhiteSpace(source))
            {
                return string.Empty;
            }
            Regex regex = new Regex("[&?]_contentType=(?<contentType>(.*?))&", RegexOptions.IgnoreCase);
            Match match = regex.Match(source);
            if (match.Success)
            {
                return match.Groups["contentType"].Value;
            }
            else
            {
                return string.Empty;
            }
        }

posted @ 2016-10-14 16:55 xu_happy_you 阅读(1498) 评论(0) 推荐(1) 编辑
摘要: 原来写过一篇三层架构之泛型应用的简单登录,已经过去2年了,今天有一朋友问我关于抽象工厂的问题,就把自己后来解耦的方法从项目中拿出来了,方便大家学习。我重新写了一个例子项目,如下截图:XU.Model层中有一个抽象类BaseModel.cs,User.cs是用户实体类,继承与BaseModel类,是用于类型安全考虑的1 using System;2 3 namespace XU.Model4 {5 public abstract class BaseModel6 {7 }8 }BaseModel.cs 1 using System; 2 3 namespace XU.M... 阅读全文
posted @ 2013-12-27 17:21 xu_happy_you 阅读(7375) 评论(6) 推荐(6) 编辑
摘要: ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——数据库的设计(一)菜单和模块是在同一个表中,采用的是树形结构,模块菜单表结构如下代码: 1 USE [Permission] 2 GO 3 4 /****** Object: Table [dbo].[Per... 阅读全文
posted @ 2013-11-20 17:30 xu_happy_you 阅读(16991) 评论(196) 推荐(30) 编辑
摘要: 快一年没写博客了,这段时间感觉好迷茫,写点博客,记录一下自己的成长过程,希望对大家也有帮助 先上图 一个用户可以有多个角色,一个用户可以属于多个部门,这些都可以控制到权限,有时特殊要求,同样的部门和角色不一定有同样的权限(虽然可以定义多个角色来实现,但是如果这种情况多了就有点麻烦了),所以还弄了个基于用户的权限,这样就可以很灵活的控制了。 每个模块的包含那些可控制的权限,用一个int类型字段控制,下边用一个枚举位标示出了系统所有的可能的权限(根据实际情况) using System;namespace Mydream.Permission.Common{ [Flags] ... 阅读全文
posted @ 2013-10-16 10:33 xu_happy_you 阅读(22213) 评论(24) 推荐(16) 编辑
摘要: 最近在学习javascript,所以写下例子,练习一下,记录今天,方便以后查看! JavaScript用的是静态私有变量,每个实例都没有自己的私有变量。 Css代码如下: 1 table {max-width: 100%;background-color: transparent;border-collapse: collapse;border-spacing: 0;} 2 .table {width: 100%;margin-bottom: 20px;} 3 .table th,.table td {padding: 8px;line-height: 20px;text-align:... 阅读全文
posted @ 2012-11-30 11:39 xu_happy_you 阅读(1260) 评论(0) 推荐(0) 编辑
摘要: 继承是OO语言中的一个最为人津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。由于javascript函数没有签名,在ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,而且其实现主要依靠原型链来实现的。 1、原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。每个构造函数都有一个原型对象,原型对象中包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么,假如我们让原型对象等于另... 阅读全文
posted @ 2012-11-28 14:35 xu_happy_you 阅读(3796) 评论(4) 推荐(3) 编辑
摘要: 1、求阶乘1 function factorial(num){2 if(num<=1){3 return 1;4 }else{5 return num*arguments.callee(num-1);6 }7 }2、求随机数n到m之间的数,包含m和n1 function selectFrom(lowerValue,upperValue){2 return Math.floor(Math.random()*(upperValue-lowerValue+1)+lowerValue);3 }3、判断属性是存在与对象还是存在于原型中,Tr... 阅读全文
posted @ 2012-11-27 14:58 xu_happy_you 阅读(480) 评论(0) 推荐(2) 编辑
摘要: 1、给你一个字符串,要你找出里面出现次数最多的字母和出现的次数,例如:“abaasdffggghhjjkkgfddsssss”; 1 var str = "abaasdffggghhjjkkgfddsssss"; 2 var arr = new Array(); 3 var i = 0; 4 while (str.charAt(0)) { 5 arr[i] = str.charAt(0) + "=" + (str.split(str.charAt(0)).length - 1); 6 str = str.split(str.charAt(... 阅读全文
posted @ 2012-10-10 14:43 xu_happy_you 阅读(636) 评论(0) 推荐(0) 编辑
摘要: 2011年6月22拿的毕业证,还有十几天就毕业一年了,时间过得真快,去年写了一个div弹出层的登录,这次是要写一些东西也涉及到这方面,就又写了一个,不善于言语组织,重在分享!请见谅!在此和大家一起分享一下!上次的地址是:div弹出层的ajax登录(Jquery版)看见别人博客都有一个返回顶部(图片是借用梦想天空的),我也写了一下,先引用jquery(博客园中使用的话,就不需要引用jquery,因为博客中已经引用了),再直接引用这个js就ok了!http://files.cnblogs.com/cmsdn/top.js,就是本博客的返回顶部!这次本想做一个简易数据库管理的web版本,由于技术有限 阅读全文
posted @ 2012-06-07 14:45 xu_happy_you 阅读(11210) 评论(6) 推荐(5) 编辑
摘要: 以下SQL以防以后还需用到,特此备份删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL 1 ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] 2 ( 3 @leavewordID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 BEGIN TRANSACTION10 DELETE FROM tb_leavewordID WHERE leavewordID=@leavewordID11... 阅读全文
posted @ 2012-04-25 12:17 xu_happy_you 阅读(1171) 评论(1) 推荐(2) 编辑
点击右上角即可分享
微信分享提示