亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

WebApi系列~在WebApi中實現Cors訪問

2019-11-15 02:31:05
字體:
來源:轉載
供稿:網友

WebApi系列~在WebApi中實現Cors訪問

回到目錄

說在前

Cors是個比較熱的技術,這在蔣金楠的博客里也有體現,Cors簡單來說就是“跨域資源訪問”的意思,這種訪問我們指的是Ajax實現的異步訪問,形象點說就是,一個A網站公開一些接口方法,對于B網站和C網站可以通過發xmlhttPRequest請求來調用A網站的方法,對于xmlhttprequest封裝比較好的插件如jquery的$.ajax,它可以讓開發者很容易的編寫AJAX異步請求,無論是Get,Post,Put,Delete請求都可以發送。

Cors并不是什么新的技術,它只是對HTTP請求頭進行了一個加工,還有我們的Cors架構里,對jsonp也有封裝,讓開發者在使用jsonp訪問里,編寫的代碼量更少,更直觀,呵呵。(Jsonp和Json沒什么關系,它是從一個URI返回一個Script響應塊,所以,JSONP本身是和域名沒關系的,而傳統上的JSON是走xmlhttprequest的,它在默認情況下,是不能跨域訪問的)

做在后

一  下面先說一下,對jsonp的封裝

1 注冊jsonp類型,在global.asax里application_Start方法中

 GlobalConfiguration.Configuration.Formatters.Insert(0, new EntityFrameworks.Web.Core.JsonpMediaTypeFormatter());

2 編寫JsonpMediaTypeFormatter這個類型中實現了對jsonp請求的響應,并在響應流中添加指定信息,如callback方法名。

 /// <summary>    /// 對jsonp響應流的封裝    /// </summary>    public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter    {        public string Callback { get; private set; }        public JsonpMediaTypeFormatter(string callback = null)        {            this.Callback = callback;        }        public override Task WriteToStreamAsync(            Type type,            object value,            Stream writeStream,            HttpContent content,            TransportContext transportContext)        {            if (string.IsNullOrEmpty(this.Callback))            {                return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);            }            try            {                this.WriteToStream(type, value, writeStream, content);                return Task.FromResult<AsyncVoid>(new AsyncVoid());            }            catch (Exception exception)            {                TaskCompletionSource<AsyncVoid> source = new TaskCompletionSource<AsyncVoid>();                source.SetException(exception);                return source.Task;            }        }        private void WriteToStream(            Type type,            object value,            Stream writeStream,            HttpContent content)        {            JsonSerializer serializer = JsonSerializer.Create(this.SerializerSettings);            using (StreamWriter streamWriter = new StreamWriter(writeStream, this.SupportedEncodings.First()))            using (JsonTextWriter jsonTextWriter = new JsonTextWriter(streamWriter) { CloSEOutput = false })            {                jsonTextWriter.WriteRaw(this.Callback + "(");                serializer.Serialize(jsonTextWriter, value);                jsonTextWriter.WriteRaw(")");            }        }        public override MediaTypeFormatter GetPerRequestFormatterInstance(            Type type,            HttpRequestMessage request,            MediaTypeHeaderValue mediaType)        {            if (request.Method != HttpMethod.Get)            {                return this;            }            string callback;            if (request.GetQueryNameValuePairs().ToDictionary(pair => pair.Key,                 pair => pair.Value).TryGetValue("callback", out callback))            {                return new JsonpMediaTypeFormatter(callback);            }            return this;        }        [StructLayout(LayoutKind.Sequential, Size = 1)]        private struct AsyncVoid        {        }    }

二  對指定域名實現友好的跨域資源訪問

1 在global.asax中注冊這個HttpHandler,使它對HTTP的處理進行二次加工,它可以有同步和異步兩個版本,本例中實現異步方式實現

 //對指定URI的網站進行跨域資源的共享 GlobalConfiguration.Configuration.MessageHandlers.Add(new EntityFrameworks.Web.Core.Handlers.CorsMessageHandler());

下面是MessageHandlers原代碼,實現對HTTP請求的二次處理

    /// <summary>    /// 跨域資源訪問的HTTP處理程序    /// </summary>    public class CorsMessageHandler : DelegatingHandler    {        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)        {            //得到描述目標Action的HttpActionDescriptor            HttpMethod originalMethod = request.Method;            bool isPreflightRequest = request.IsPreflightRequest();            if (isPreflightRequest)            {                string method = request.Headers.GetValues("access-Control-Request-Method").First();                request.Method = new HttpMethod(method);            }            HttpConfiguration configuration = request.GetConfiguration();            HttpControllerDescriptor controllerDescriptor = configuration.Services.GetHttpControllerSelector().SelectController(request);            HttpControllerContext controllerContext = new HttpControllerContext(request.GetConfiguration(), request.GetRouteData(), request)            {                ControllerDescriptor = controllerDescriptor            };            HttpActionDescriptor actionDescriptor = configuration.Services.GetActionSelector().SelectAction(controllerContext);            //根據HttpActionDescriptor得到應用的CorsAttribute特性            CorsAttribute corsAttribute = actionDescriptor.GetCustomAttributes<CorsAttribute>().FirstOrDefault() ??                controllerDescriptor.GetCustomAttributes<CorsAttribute>().FirstOrDefault();            if (null == corsAttribute)            {                return base.SendAsync(request, cancellationToken);            }            //利用CorsAttribute實施授權并生成響應報頭            IDictionary<string, string> headers;            request.Method = originalMethod;            bool authorized = corsAttribute.TryEvaluate(request, out headers);            HttpResponseMessage response;            if (isPreflightRequest)            {                if (authorized)                {                    response = new HttpResponseMessage(HttpStatusCode.OK);                }                else                {                    response = request.CreateErrorResponse(HttpStatusCode.BadRequest, corsAttribute.ErrorMessage);                }            }            else            {                response = base.SendAsync(request, cancellationToken).Result;            }            //添加響應報頭            if (headers != null && headers.Any())                foreach (var item in headers)                    response.Headers.Add(item.Key, item.Value);            return Task.FromResult<HttpResponseMessage>(response);        }    }

2 添加Cors特性,以便處理可以跨域訪問的域名,如B網站和C網站

    /// <summary>    /// Cors特性    /// </summary>   [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]       public class CorsAttribute : Attribute    {        public Uri[] AllowOrigins { get; private set; }        public string ErrorMessage { get; private set; }        public CorsAttribute(params string[] allowOrigins)        {            this.AllowOrigins = (allowOrigins ?? new string[0]).Select(origin => new Uri(origin)).ToArray();        }        public bool TryEvaluate(HttpRequestMessage request, out IDictionary<string, string> headers)        {            headers = null;            string origin = null;            try            {                origin = request.Headers.GetValues("Origin").FirstOrDefault();            }            catch (Exception)            {                this.ErrorMessage = "Cross-origin request denied";                return false;            }            Uri originUri = new Uri(origin);            if (this.AllowOrigins.Contains(originUri))            {                headers = this.GenerateResponseHeaders(request);                return true;            }            this.ErrorMessage = "Cross-origin request denied";            return false;        }        private IDictionary<string, string> GenerateResponseHeaders(HttpRequestMessage request)        {            //設置響應頭"Access-Control-Allow-Methods"            string origin = request.Headers.GetValues("Origin").First();            Dictionary<string, string> headers = new Dictionary<string, string>();            headers.Add("Access-Control-Allow-Origin", origin);            if (request.IsPreflightRequest())            {                //設置響應頭"Access-Control-Request-Headers"                //和"Access-Control-Allow-Headers"                headers.Add("Access-Control-Allow-Methods",
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲精品视频| 亚洲国产精品成人一区二区| 成人亲热视频网站| 久久久久久尹人网香蕉| 欧美一区二区三区……| 欧美特黄级在线| 成人免费淫片aa视频免费| 国产精品久久久久久久久久| 日本欧美黄网站| 亚洲自拍中文字幕| 久久精品国产成人精品| 久久躁日日躁aaaaxxxx| 国产精品入口夜色视频大尺度| 色噜噜国产精品视频一区二区| 国产成人精品午夜| 亚洲剧情一区二区| 亚洲黄一区二区| 久久精品99久久香蕉国产色戒| 国产精品第100页| 亚洲经典中文字幕| 高清欧美电影在线| 亚洲字幕一区二区| 97av在线播放| 欧美裸体男粗大视频在线观看| 亚洲美女在线看| 亚洲最大福利网| 欧美自拍大量在线观看| 国产精品网址在线| 91精品视频大全| 色与欲影视天天看综合网| 欧美亚洲激情在线| 日韩中文理论片| 久久久久久久色| 精品日韩视频在线观看| 国产精品三级久久久久久电影| 欧美丰满老妇厨房牲生活| 国产精品美女在线观看| 不卡av电影在线观看| 国产国语刺激对白av不卡| 国产精品777| 国语自产精品视频在线看抢先版图片| 91中文字幕在线| 亚洲精品一区中文字幕乱码| 中文日韩在线视频| 国产精品www色诱视频| 日本一本a高清免费不卡| 欧美色播在线播放| 国产精品网站入口| 欧美成人国产va精品日本一级| 成人av.网址在线网站| 揄拍成人国产精品视频| 久久人91精品久久久久久不卡| 青青精品视频播放| 国产精品福利片| 中文字幕自拍vr一区二区三区| 伊人亚洲福利一区二区三区| 国产精品中文字幕在线| 中文字幕九色91在线| 欧美精品999| 精品久久久久久久久久久久久| 亚洲一区精品电影| 欧美激情久久久久久| 欧美福利视频在线观看| 欧美性猛交xxxx偷拍洗澡| 精品视频久久久久久久| 色偷偷av亚洲男人的天堂| 亚洲一区二区在线| 亚洲美女在线观看| 亚洲自拍偷拍福利| 日韩高清av在线| 日韩电影在线观看中文字幕| 国产精品免费一区豆花| 性色av一区二区三区红粉影视| 欧美性69xxxx肥| 伊人伊人伊人久久| 成人精品视频久久久久| 亚洲国产成人久久| 91热福利电影| 国产亚洲精品久久久优势| 欧美亚洲日本网站| 欧美一级视频一区二区| 91精品中国老女人| 亚洲精品国产精品乱码不99按摩| 91老司机在线| 亚洲人成在线免费观看| 国产精品视频色| 成人免费视频网址| 高清亚洲成在人网站天堂| 狠狠色狠色综合曰曰| 韩日精品中文字幕| 国产精品久久久久久久久久免费| 中文字幕日韩欧美在线视频| 欧美精品激情在线观看| 精品国产一区二区三区四区在线观看| 亚洲高清久久久久久| 国产精品aaa| 中文精品99久久国产香蕉| 国产伦精品一区二区三区精品视频| 亚洲欧美国产视频| 97精品在线观看| 中文字幕免费精品一区高清| 亚洲影院色在线观看免费| 中国日韩欧美久久久久久久久| 中文字幕在线看视频国产欧美在线看完整| 欧美精品电影在线| 91中文在线视频| 成人黄色片网站| 日韩精品在线观看网站| 日韩中文字幕久久| 亚洲成人精品av| 欧美一级在线播放| 97视频免费在线看| 韩国欧美亚洲国产| 久久福利视频导航| 97av在线视频免费播放| 国产精品国模在线| 亚洲电影免费观看高清完整版在线观看| 国产精品日韩在线播放| 日韩有码在线电影| 中文字幕精品www乱入免费视频| 91久久中文字幕| 色哟哟亚洲精品一区二区| 精品视频在线观看日韩| 久久精品国产成人精品| 亚洲精品视频网上网址在线观看| 亚洲va久久久噜噜噜| 亚洲欧美激情另类校园| 国产成人精品网站| 国产免费亚洲高清| 久久久久久网址| 国产亚洲精品综合一区91| 久久伊人精品一区二区三区| 日韩电影免费观看中文字幕| 久久久天堂国产精品女人| 性金发美女69hd大尺寸| 大胆人体色综合| 色综合天天综合网国产成人网| 欧美一级bbbbb性bbbb喷潮片| 91精品在线观| 久久久国产精品一区| 日韩影视在线观看| 国产午夜精品视频免费不卡69堂| 91产国在线观看动作片喷水| 色www亚洲国产张柏芝| 狠狠色狠狠色综合日日五| 超碰97人人做人人爱少妇| 国产午夜精品视频免费不卡69堂| 欧美猛少妇色xxxxx| 91午夜在线播放| 青青精品视频播放| 一色桃子一区二区| 欧美激情女人20p| 最好看的2019的中文字幕视频| 日韩中文字幕网站| 国产欧美一区二区三区久久人妖| 91黑丝在线观看| 精品国内产的精品视频在线观看| 欧美午夜精品伦理| 日本精品视频在线播放| 欧美激情精品久久久久久| 亚洲另类xxxx| 亚洲wwwav| 91亚洲精品在线| 欧美综合一区第一页|