導航:首頁 > 凈水問答 > webapi自定義過濾器

webapi自定義過濾器

發布時間:2022-04-10 17:10:24

㈠ 如何改寫WebApi部分默認規則

如何改寫WebApi部分默認規則

如何改寫WebApi部分默認規則為什麼要改最近公司在推廣SOA框架,第一次正經接觸這種技術(之前也有但還是忽略掉吧),感覺挺好,就想自己也折騰一下,實現一個簡單的SOA框架
用過mvc進行開發,印象之中WebApi和Mvc好像是一樣的,帶著這樣的預設開始玩WebApi,然後被虐得找不到著北。
被虐的原因,是Mvc和WebApi在細節上差別還是有點大,例如:
在Mvc中,一個Controller中的所有公共方法一般情況下可以響應POST方法,而WebApi中不行在Mvc中,一個Action方法中的參數即可來自Url,也可以來自Form,而WebApi中不是這樣,具體的規則好像是除非你在參數中加了[FromBody],否則這個參數永遠也無法從Form中獲取這是這兩種技術我知道的最大的差別,其他的沒發現或者說是沒注意,也有可能這些差別是因為我不會用,畢竟接觸WebApi時間不長。如果我有些地方說錯了,請指正。
就這兩個不同點,我查了很多資料,也沒有辦法解決,第一個還好,加個特性就行了,第二個的話好像就算加了[FromBody]也還是不行,感覺就是一堆限制。接著,既然這么多讓我不爽的地方,那我就來改造它吧。
改造的目標,有以下幾個:
不再限制控制器必須以Controller結尾,其實這個並不是必須,只是被限制著確實不太舒服所有方法可以響應所有的請求方法,如果存在方法名相同的方法,那麼才需要特性來區分Action中的參數優先從Url中獲取,再從Body中獲取,從Body中獲取的時候,優先假設Body中的數據是表單參數,若不是則將Body中的數據當作json或xml數據進行獲取定下了目標之後,感覺微軟為什麼要這樣設計WebApi呢,或許它有它的道理。
目標好定,做起來真是頭大,一開始想參考公司的SOA框架的實現,但因為我用了OWIN技術來進行宿主,而看了公司的框架好像不是用的這個,總之就是看了半天沒看懂應該從哪個地方開始,反而是越看越糊,畢竟不是完全一樣的技術,所以還是自己弄吧。
OK,廢話了這么多,進入正題吧。首先來一個鏈接,沒了這個文章我就不可能改造成功:http://www.cnblogs.com/beginor/archive/2012/03/22/2411496.html
OWIN宿主其實這個網上很多,我主要是為了貼代碼,不然的話下面幾小節寫不下去
[assembly: OwinStartup(typeof(Startup))]//這句是在IIS宿主的時候使用的,作用是.Net會查找Startup類來啟動整個服務 namespace Xinchen.SOA.Server { public class Startup { public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttPRoute( name: "DefaultApi", routeTemplate: "{controller}/{action}" ); config.Services.Add(typeof(ValueProviderFactory), new MyValueProviderFactory());//自定義參數查找,實現第三個目標 config.Services.Replace(typeof(IHttpControllerSelector), new ControllerSelector(config));//自定義控制器查找,實現第一個目標 config.Services.Replace(typeof(IHttpActionSelector), new HttpActionSelector());//自定義Action查找,實現第二個目標 appBuilder.UseWebApi(config); } } } 省略了部分不太重要的代碼,Services.Add和Replace從字面就能明白是什麼意思,但我沒有試過是否必須要像上面那樣寫才行
對控制器的限制public class ControllerSelector : IHttpControllerSelector { HttpConfiguration _config; IDictionary<string, HttpControllerDescriptor> _desriptors = new Dictionary<string, HttpControllerDescriptor>(StringComparer.OrdinalIgnoreCase); public ControllerSelector(HttpConfiguration config) { _config = config; } void InitControllers() { if (_desriptors.Count <= 0) { lock (_desriptors) { if (_desriptors.Count <= 0) { var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => !x.GlobalAssemblyCache && !x.IsDynamic); var controllerTypes = new List<Type>(); foreach (var ass in assemblies) { controllerTypes.AddRange(ass.GetExportedTypes().Where(x => typeof(ApiController).IsAssignableFrom(x))); } var descriptors = new Dictionary<string, HttpControllerDescriptor>(); foreach (var controllerType in controllerTypes) { var descriptor = new HttpControllerDescriptor(_config, controllerType.Name, controllerType); _desriptors.Add(descriptor.ControllerName, descriptor); } } } } } public IDictionary<string, HttpControllerDescriptor> GetControllerMapping() { InitControllers(); return _desriptors; } public System.Web.Http.Controllers.HttpControllerDescriptor SelectController(System.Net.Http.HttpRequestMessage request) { InitControllers(); var routeData = request.GetRouteData(); var controllerName = Convert.ToString(routeData.Values.Get("controller")); if (string.IsNullOrWhiteSpace(controllerName)) { throw new ArgumentException(string.Format("沒有在路由信息中找到controller")); } return _desriptors.Get(controllerName); } } 這個其實比較簡單,測試中WebApi好像沒調用GetControllerMapping方法,直接調用了SelectController方法,最後一個方法中有兩個Get方法調用,Get只是把從字典獲取值的TryGetValue功能給封裝了一下,InitControllers方法是從當前所有的程序集中找繼承了ApiController的類,找到之後緩存起來。這段代碼整體比較簡單。
對Action的限制public class HttpActionSelector : IHttpActionSelector { public ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor) { var methods = controllerDescriptor.ControllerType.GetMethods(); var result = new List<HttpActionDescriptor>(); foreach (var method in methods) { var descriptor = new ReflectedHttpActionDescriptor(controllerDescriptor, method); result.Add(descriptor); } return result.ToLookup(x => x.ActionName); } public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext) { var actionDescriptor = new ReflectedHttpActionDescriptor(); var routeData = controllerContext.RouteData; object action = string.Empty; if (!routeData.Values.TryGetValue("action", out action)) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在路由中未找到action")); } string actionName = action.ToString().ToLower(); var methods = controllerContext.ControllerDescriptor.ControllerType.GetMethods().Where(x => x.Name.ToLower() == actionName); var count = methods.Count(); MethodInfo method = null; switch (count) { case 0: throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中未找到名為" + actionName + "的方法")); case 1: method = methods.FirstOrDefault();
break; default: var httpMethod = controllerContext.Request.Method; var filterdMethods = methods.Where(x => { var verb = x.GetCustomAttribute<AcceptVerbsAttribute>(); if (verb == null) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多個名為" + actionName + "的方法,請考慮為這些方法加上AcceptVerbsAttribute特性")); } return verb.HttpMethods.Contains(httpMethod); }); if (filterdMethods.Count() > 1) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多個名為" + actionName + "的方法,並且這些方法的AcceptVerbsAttribute都含有" + httpMethod.ToString() + ",發生重復")); } else if (filterdMethods.Count() <= 0) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多個名為" + actionName + "的方法,但沒有方法被配置為可以響應" + httpMethod.ToString() + "請求")); } method = filterdMethods.FirstOrDefault();
break; } return new ReflectedHttpActionDescriptor(controllerContext.ControllerDescriptor, method); } } GetActionMapping方法很簡單,從控制器類型中找到所有的Action方法並返回
SelectAction方法相對復雜,其實就是第二個目標的邏輯,代碼看起來比較多其實並有很難的地方。
對Action的參數的限制這一塊比較難,我試了很久才成功,而且還有坑
public class ActionValueBinder : DefaultActionValueBinder { protected override HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter) { ParameterBindingAttribute parameterBinderAttribute = parameter.ParameterBinderAttribute; if (parameterBinderAttribute == null) { parameterBindingRules = parameter.Configuratio

㈡ 昨天有老同學問我怎麼在Windows Server2012 R2裡面部署 MVC 的網

一直以來都是在win8或windows server2012中進行asp.net mvc或webapi程序的部署,沒有發現任何問題。今天在win2008中進行asp.net webapi的部署,訪問api的時候頁面顯示404錯誤。下面步驟將解決asp.net webapi在win2008中的部署問題。
添加映射
在iis中選中需要設置的webapi站點,雙擊「處理程序映射」

在彈出框中添加對webapi的請求映射:

請求路徑:api /*
可執行文件:%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll,注意32位和64位路徑的區別。
名稱:webapi,自定義名稱即可
修改應用程序池的管道模式
將webapi的應用程序池的管道模式修改為經典
更新dll
映射添加之後,訪問站點,不會報404錯誤了,但會報一些dll文件未能載入,一共有4個,名稱分別如下:
System.Web.WebPages.Deployment.dll
Microsoft.Web.Infrastructure.dll
System.Web.WebPages.Razor.dll
System.Web.WebPages.dll
將上面四個dll文件復制到webapi站點到bin目錄中,問題解決。

㈢ net webapi 能不能使用mvc的過濾

這個很有用的,13個擴展點中過濾器占重要的地位。自定義身份驗證、自定義post表單時自動檢測錯誤、自定義發生異常時的自動化處理、等等應用。一定要搞明白的。

㈣ 如何使 WebAPI 自動生成漂亮又實用在線API文檔

1.1 SwaggerUI

SwaggerUI 是一個簡單的Restful API 測試和文檔工具。簡單、漂亮、易用(官方)。通過讀取JSON 配置顯示API. 項目本身僅僅也只依賴一些 html,css.js靜態文件. 你可以幾乎放在任何Web容器上使用。

1.2 Swashbuckle

Swashbuckle 是.NET類庫,可以將WebAPI所有開放的控制器方法生成對應SwaggerUI的JSON配置。再通過SwaggerUI 顯示出來。類庫中已經包含SwaggerUI 。所以不需要額外安裝。

2.快速開始

創建項目 OnlineAPI來封裝網路音樂服務(示例下載) ,通過API可以搜索、獲取音樂的信息和播放連接。

我盡量刪除一些我們demo中不會用到的一些文件,使其看上去比較簡潔。

WebAPI 安裝 Swashbuckle

Install-Package Swashbuckle

代碼注釋生成文檔說明。
Swashbuckle 是通過生成的XML文件來讀取注釋的,生成 SwaggerUI,JSON 配置中的說明的。
安裝時會在項目目錄 App_Start 文件夾下生成一個 SwaggerConfig.cs 配置文件,用於配置 SwaggerUI 相關展示行為的。如圖:

將配置文件大概99行注釋去掉並修改為
c.IncludeXmlComments(GetXmlCommentsPath(thisAssembly.GetName().Name));

並在當前類中添加一個方法

/// <summary>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
protected static string GetXmlCommentsPath(string name)
{
return string.Format(@"{0}\bin\{1}.XML", AppDomain.CurrentDomain.BaseDirectory, name);
}

緊接著你在此Web項目屬性生成選卡中勾選 「XML 文檔文件」,編譯過程中生成類庫的注釋文件

添加網路音樂 3個API

訪問 http://<youhost>/swagger/ui/index,最終顯示效果

我們通過API 測試API 是否成功運行

3.添加自定義HTTP Header

在開發移動端 API時常常需要驗證許可權,驗證參數放在Http請求頭中是再好不過了。WebAPI配合過濾器驗證許可權即可

首先我們需要創建一個 IOperationFilter 介面的類。IOperationFilter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.Filters;
using Swashbuckle.Swagger;

namespace OnlineAPI.Utility
{
public class HttpHeaderFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry
schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters == null) operation.parameters = new
List<Parameter>();
var filterPipeline =
apiDescription.ActionDescriptor.GetFilterPipeline();
//判斷是否添加許可權過濾器
var isAuthorized = filterPipeline.Select(filterInfo =>
filterInfo.Instance).Any(filter => filter is IAuthorizationFilter);
//判斷是否允許匿名方法
var allowAnonymous =
apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();

if (isAuthorized && !allowAnonymous)
{
operation.parameters.Add(new Parameter
{
name = "access-key",
@in = "header",
description = "用戶訪問Key",
required = false,
type = "string"
});
}
}
}
}

在 SwaggerConfig.cs 的 EnableSwagger 配置匿名方法類添加一行注冊代碼
c.OperationFilter<HttpHeaderFilter>();

添加Web許可權過濾器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using Newtonsoft.Json;

namespace OnlineAPI.Utility
{
/// <summary>
///
/// </summary>
public class AccessKeyAttribute : AuthorizeAttribute
{
/// <summary>
/// 許可權驗證
/// </summary>
/// <param name="actionContext"></param>
/// <returns></returns>
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var request = actionContext.Request;
if (request.Headers.Contains("access-key"))
{
var accessKey = request.Headers.GetValues("access-key").SingleOrDefault();
//TODO 驗證Key
return accessKey == "123456789";
}
return false;
}

/// <summary>
/// 處理未授權的請求
/// </summary>
/// <param name="actionContext"></param>
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var content = JsonConvert.SerializeObject(new {State = HttpStatusCode.Unauthorized});
actionContext.Response = new HttpResponseMessage
{
Content = new StringContent(content, Encoding.UTF8, "application/json"),
StatusCode = HttpStatusCode.Unauthorized
};
}
}
}

在你想要的ApiController 或者是 Action 添加過濾器
[AccessKey]

最終顯示效果

4.顯示上傳文件參數

SwaggerUI 有上傳文件的功能和添加自定義HTTP Header 做法類似,只是我們通過特殊的設置來標示API具有上傳文件的功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Description;
using Swashbuckle.Swagger;

namespace OnlineAPI.Utility
{
/// <summary>
///
/// </summary>
public class UploadFilter : IOperationFilter
{

/// <summary>
/// 文件上傳
/// </summary>
/// <param name="operation"></param>
/// <param name="schemaRegistry"></param>
/// <param name="apiDescription"></param>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (!string.IsNullOrWhiteSpace(operation.summary) && operation.summary.Contains("upload"))
{
operation.consumes.Add("application/form-data");
operation.parameters.Add(new Parameter
{
name = "file",
@in = "formData",
required = true,
type = "file"
});
}
}
}
}

在 SwaggerConfig.cs 的 EnableSwagger 配置匿名方法類添加一行注冊代碼
c.OperationFilter<UploadFilter>();

API 文檔展示效果

㈤ 如何在Windows Server2008R2中部署WebAPI

一、安裝說明:
1、安裝基本信息
電腦軟體
在WindowsServer2008(或WindowsServer2008R2)中,單擊「開始」-「程序」-「管理工具」-「伺服器管理」,或在「運行」中輸入命令:servermanager.msc命令打「伺服器管理」程序。
在「角色」選項中,單擊「添加角色」:
選擇伺服器角色:Web伺服器(IIS)
單擊選中「web伺服器(IIS))前面的單選框。
在彈出的對話框中,單擊「添加必需的功能」:

「添加角色向導」對web伺服器進行簡單介紹,之後單擊「下一步」:
選擇角色需要的相關服務之後單擊「下一步」:
確認安裝選擇,之後單擊「下一步」:
系統開始安裝所選的角色服務,可能需要幾十秒可幾鍾時間:
安裝完成,點擊關閉即可:

名稱:IIS7.0安裝
大小:10MB|版本:7.0|類別:系統工具|語言:中文
應用平台:windows server 2008
2、安裝介紹
windows server 2008系統中的iis安裝,與windows server 2003中的安裝明顯不再相同了,windows server 2008安裝iis,不再需要其他相關組件,不像windows server 2003需要有i386文件,下面來詳細介紹一下,windows server 2008安裝iis的步驟:
二、安裝步驟:
開始--伺服器管理--角色--添加角色

點擊添加必需的功能

勾選在「Web伺服器(IIS)」

點擊下一步

下面是選擇「角色服務」的,針對你需要的進行相應的選擇

然後點擊「下一步」開始確認安裝

然後等待安裝成功

㈥ 使用Web API問題,怎麼解決

  1. 繼承ExceptionFilterAttribute類,重寫OnException方法

:ExceptionFilterAttribute{//重寫基類的異常處理方法publicoverridevoidOnException(){//業務異常處理if(actionExecutedContext.ExceptionisBusinessException){varbusinessException=(BusinessException)actionExecutedContext.Exception;//自定義業務異常編碼intbusinessExceptionCode=businessException.ErrorMessage.Code;//業務異常消息stringbusinessExceptionMsg=businessException.Message;//異常消息Json串varerr=new{errcode=businessExceptionCode,errmsg=businessExceptionMsg};stringerrMsg=JsonConvert.SerializeObject(err);//系統異常碼varoResponse=newHttpResponseMessage(HttpStatusCode.InternalServerError);oResponse.Content=newStringContent("");oResponse.Headers.Add("errMsg",errMsg);actionExecutedContext.Response=oResponse;}else{actionExecutedContext.Response=newHttpResponseMessage(HttpStatusCode.InternalServerError);//異常消息Json串varerr=new{errcode=CommonErrorCode.ServiceError,errmsg=actionExecutedContext.Exception.Message};stringerrMsg=JsonConvert.SerializeObject(err);//系統異常碼varoResponse=newHttpResponseMessage(HttpStatusCode.InternalServerError);oResponse.Content=newStringContent("");oResponse.Headers.Add("errMsg",errMsg);actionExecutedContext.Response=oResponse;}base.OnException(actionExecutedContext);}}
2.Global.asax中,Application_Start方法中添加過濾器
12345protectedvoidApplication_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);GlobalConfiguration.Configuration.Filters.Add(());}
3.例子:
控制器:
:ApiController{[HttpGet]publicstringGetTest1(){return"value1";}[HttpGet]publicstringGetTest2(){thrownewBusinessException(123456,"業務異常");}[HttpGet]publicstringGetTest3(){thrownewException("系統異常");}}

㈦ 在WebApi中返回一個JSON格式的數據,如何到客戶端就變了

轉載 在使用Web Api的時候,有時候只想返回JSON;實現這一功能有多種方法,本文提供兩種方式,一種傳統的,一種作者認為是正確的方法。

JSON in Web API – the formatter based approach

只支持JSON最普遍的做法是:首先清除其他所有的formatters,然後只保留JsonMediaTypeFormatter。

有了HttpConfiguration的實例,你將會很簡單的清除所有formatters,然後重新添加JsonMediaTypeFormatter。

實現代碼如下:

configuration.Formatters.Clear();
configuration.Formatters.Add(new JsonMediaTypeFormatter());這種方式雖然可以實現功能,但是所有的conent negotiation還是會發生,這就會產生以下額外的開銷了。因為,你已經知道要返回的結果了,也只想返回Json,其他的content negotiation都不需要了。

下面的方法可以很好的解決這個問題。

JSON in Web API – the conneg based approach

最好的方法是使用自定義的只返回Json Result的content negotiation代替Web Api中默認的content negotiation。

Conneg通過實現IContentNegotiator的Negotiator方法實現擴展。Negotiator方法返回ContentNegotiationResult(它包裝了你選擇的headers和formatter)。

下面的方法通過傳遞一個JsonMediaTypeFormatter給自定義的conneg negotiator,讓它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。這種方法避免了每次請求都要重新創建一次formatter。

代碼如下:

public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;

public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}

public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}接下來,你需要在HttpConfiguration實例上注冊你的新的實現機制:

var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

通過替換默認的DefaultContentNegotiator,我們使用我們自定義的JsonContentNegotiator,它只支持Json,而且可以馬上返回。

如果你想更深入的了解Content Negotiation的知識,你可以查看作者的這篇文章。

總結

通過使用自定義的JsonContentNegotiator替換系統默認的DefaultContentNegotiator,很好的實現Web Api只返回Json的功能,而且沒有額外的開銷。

㈧ .net core中如何在執行action前植入一個webapi過濾器

新建一個MyFilter.cs

public class MyFilter: Attribute,IAuthorizationFilter
實現 OnAuthorization 驗證

public class MyFilter : Attribute,IActionFilter,IOrderedFilter
實現 OnActionExecuted(請求方法後)和專 OnActionExecuting(請求方法前)

Startup.cs中ConfigureServices方法中 注冊屬此MyFilter.cs

services.AddMvc(config => config.Filters.Add(new MyFilter()));



㈨ js調用跨域get請求調用webApi 多出個options請求是為什麼

我嘗試用我的語言描述一下吧:

先說跨域請求的原理,瀏覽器的安全機制是不允許出現跨域請求的,否則會有很嚴重的安全問題,解決跨域問題有幾種不同的方法,你題目中提到的方法就是通過在Response header中添加Access-Control-Allow-Origin 來讓瀏覽器知道伺服器所在的域,對用於訪問的域進行了授權。

但是因為這個Header要伺服器提供,所以無論如何,請求是要先發出去才能指導是不是允許跨域請求,所以在報跨域錯誤的時候,雖然報錯了,但是請求實際上依然發送到伺服器了,只是瀏覽器看了一眼伺服器的返回,然後發覺不行,這個請求返回的header里沒有授權,所以瀏覽器不能用。

這樣就帶來一個問題,請求會對伺服器造成影響,試想一下,要使用XHR跨域提交一個表單,無論返回頭裡面是否添加了跨域的header,都會提交一個請求到伺服器,伺服器要進行相應的操作。這種情況其實在一定條件下也是可以接受的,但是如果有更大的安全隱患,就不可以了,所以就需要OPTIONS請求了。

OPTIONS請求就是在符合一定條件下的跨域請求發送之前,瀏覽器會先發一個OPTIONS請求,問一下伺服器,是不是能跨域,如果能,就發真正的請求,如果不能,就不發了。這個的作用就很好理解了。

如上面所說,不是所有的跨域請求都要先發OPTIONS請求的,規范裡面規定,以下情況不需要先發一個 OPTIONS請求:

  1. 請求類型必須是GET、HEAD、POST中的一種。

  2. 請求的Header裡面只能包涵一些規范重點Header,以及規范的值,包括:Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save、Data、Viewport-Width、Width

  3. Content-Type的類型必須是以下幾種:application/x-www-form-urlencoded、multipart/form-data、text/plain

所以,如果你不希望瀏覽器多餘的發一個OPTIONS請求,只要遵循這個規范就可以了。

但是有時候因為需求原因,也難避免要自定義一些Header。比如,很多JS的AJAX庫,都會自定義一個Header,讓伺服器可以識別出這是否是一個非同步請求,這樣OPTIONS請求就一定要被先發送了。

順便說,伺服器端也要判斷OPTIONS類型的請求,進行一系列操作,不要讓OPTIONS請求影響到數據。

更多內容,可以看相關資料和文檔:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

https://developer.mozilla.org/en-US/docs/Web/HTTP/Server-Side_Access_Control

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

閱讀全文

與webapi自定義過濾器相關的資料

熱點內容
液相用溶劑過濾器 瀏覽:674
納濾水導電率 瀏覽:128
反滲透每小時2噸 瀏覽:162
做一個純凈水工廠需要多少錢 瀏覽:381
最終幻想4回憶技能有什麼用 瀏覽:487
污水提升器采通 瀏覽:397
反滲透和不發滲透凈水器有什麼區別 瀏覽:757
提升泵的揚程 瀏覽:294
澤德提升泵合肥經銷商 瀏覽:929
飲水機後蓋漏水了怎麼辦 瀏覽:953
小型電動提升器 瀏覽:246
半透膜和細胞膜區別 瀏覽:187
廢水拖把池 瀏覽:859
十四五期間城鎮污水處理如何提質增效 瀏覽:915
怎麼測試空氣凈化器的好壞 瀏覽:519
提升泵是幹嘛的 瀏覽:744
布油做蒸餾起沫咋辦 瀏覽:252
廣州工業油煙凈化器一般多少錢 瀏覽:204
喜哆哆空氣凈化器效果怎麼樣 瀏覽:424
油煙凈化器油盒在什麼位置 瀏覽:582