簡體   English   中英

對/ token的Web API請求有效,但對其他api控制器的請求則拋出404(與CORS相關)

[英]web api request to /token works but request to other api controllers throws 404 (cors related)

我對這里的問題有些不解。

我通過在啟動時添加以下代碼來啟用CORS

var enableCorsAttribute = new EnableCorsAttribute("*",
                                           "Origin, Content-Type, Accept",
                                           "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);

並且對/ token的請求正常工作。 我得到了正確的令牌,並且已經使用郵遞員進行了測試。

當我嘗試請求其他API控制器時,它會觸發404錯誤提示

對預檢請求的響應未通過訪問控制檢查:請求的資源上不存在“ Access-Control-Allow-Origin”標頭。

我知道缺少標題,但是除了上面發布的代碼外,我不確定如何配置它。

我正在運行angular 2應用程序來執行請求。

任何幫助將非常感激!

經過大約兩天的時間,我終於開始使用它了……希望這個答案可以幫助其他可能遇到相同問題的人。

需要注意的一件事-如果您實現或擴展簡單的身份驗證代碼,

在此方法GrantResourceOwnerCredentials您將具有以下代碼行。

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

這導致/ token請求標頭與對其他API控制器的請求之間存在不一致。

長話短說,注釋此行,以便應用相同的請求標頭。

我對web.config進行了如下更改

 <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" />      
  <remove name="WebDav" />
  <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />      
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 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="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />      
</handlers>
<httpProtocol>
  <customHeaders>

    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
    <add name="Access-Control-Allow-Methods" value="*" />
  </customHeaders>
</httpProtocol>

並且以防萬一您仍然對選項請求有疑問,可以轉到global.asax.cs文件並按如下所示修改響應:

if ((HttpContext.Current.Request.HttpMethod == "OPTIONS"))
            { 

            HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
            }

我真的希望這個答案可以節省別人的時間!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM