webapi發布常見錯誤及解決方案
錯誤一:
錯誤:404 (Not Found)
解決方案:
在 <system.webServer>節點中添加如下模塊:
<modules runAllManagedModulesForAllRequests="true" />
錯誤二:
錯誤:405 (Method Not Allowed)或者Response for preflight has invalid HTTP status code 405.
解決方案:(兩個條件同時滿足才可以)
webapi配置文件:
<modules runAllManagedModulesForAllRequests="true" /> 這個是核心,其他的都可以沒有這個是必須的(但是安全方面考慮肯定是不可以的,然后通過如下方案方式解決)
2.后端處理:
第一種方案:在控制器中對應的方法都增加一個支持OPTIONS請求的方法,返回202即可;accepted就是202
[HttpOptions] public HttpResponseMessage Login() { return new HttpResponseMessage(HttpStatusCode.Accepted); } /// <summary> /// 用戶登陸 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public HttpResponseMessage Login([FromBody] LoginModel model) { var cache = HttpRuntime.Cache; var user = cache.Get(model.Account) as UserModel; if (user == null) { return Error(1, "用戶未注冊!"); } if (user.Password != model.Password) { return Error(1, "用戶名或密碼錯誤!"); } return Success(0, "登陸成功!", user); }
第二種方案:在Global文件中增加如下這個方法:(推薦使用)
protected void Application_BeginRequest(object sender, EventArgs e) { var res = HttpContext.Current.Response; var req = HttpContext.Current.Request; //自定義header時進行處理 if (req.HttpMethod == "OPTIONS") { //res.AppendHeader("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name,Token,Cookie,Authorization"); //res.AppendHeader("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS"); res.StatusCode = 202; res.End(); } }
如上如果不可以,可以嘗試如下方案:
在 <system.webServer>節點中添加如下模塊:
<modules runAllManagedModulesForAllRequests="true" />
-<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
或
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="WebDAV" />
<remove name="WebAPI_64bit" />
<remove name="WebAPI_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="*" resourceType="Unspecified" requireAccess="Script" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="*" resourceType="Unspecified" requireAccess="Script" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" resourceType="Unspecified" requireAccess="Script" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="WebAPI_64bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="WebAPI_32bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
</handlers>