簡體   English   中英

為Web API 1啟用CORS .net 4.0

[英]Enable CORS for Web API 1, .net 4.0

我需要為我的Web API啟用CORS,目前我無法升級到Framework 4.5。 (我了解System.Web.Http.Cors.EnableCorsAttribute。)

我試圖將以下內容添加到我的Web.config中以查看它是否有效,但它沒有:

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
  </customHeaders>
</httpProtocol>

我還試圖通過使用System.Web.Http.Filters.ActionFilterAttribute手動將Access-Control-Allow-Origin標頭設置為“*”(基於這篇文章: 向Web API中的所有響應添加自定義標頭 ) -但由於請求在進入動作過濾之前被拒絕,因此無法解決問題。

所以我現在有點卡住..任何幫助都表示贊賞。

編輯:結果

<add name="Access-Control-Allow-Origin" value="*"/>

一直是答案,我測試它之前我一定做錯了。 但是這個解決方案意味着所有操作都啟用了CORS(現在可以使用)。

POST,PUT,DELETE等使用預先發布的CORS。 瀏覽器發送OPTIONS請求。 這是因為瀏覽器首先檢查服務器端是否可以使用OPTIONS請求處理CORS,如果成功,則發送實際請求PUTPOSTDelete 由於您沒有處理OPTIONS的操作方法,因此您將獲得405.在最簡單的形式中,您必須在控制器中實現這樣的操作方法。

更多解釋 - http://www.w3.org/TR/cors/#resource-preflight-requests

http://www.html5rocks.com/en/tutorials/cors/

public HttpResponseMessage Options()
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    return response;
}

注意:此操作只響應OPTION請求,因此您需要在web.config添加必要的配置,例如Access-Control-Allow-Origin = *Access-Control-Allow-Methods = POST,PUT,DELETE

Web API 2具有CORS支持,但是對於Web API 1,您必須遵循此路徑。

嘗試添加:

    <add name="Access-Control-Allow-Headers" value="*" />

我遇到了很多關於webAPI的問題1跨域訪問終於能夠修復它看看我的博客http://keerthirb.blogspot.in/2017/08/making-cross-enable-for-webapi1.html

交叉代碼是

public class CorsHandler : DelegatingHandler
{
    const string Origin = "Origin";
    const string AccessControlRequestMethod = "Access-Control-Request-Method";
    const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
    const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
    const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
    const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        bool isCorsRequest = request.Headers.Contains(Origin);
        bool isPreflightRequest = request.Method == HttpMethod.Options;
        if (isCorsRequest)
        {
            if (isPreflightRequest)
            {
                return Task.Factory.StartNew<HttpResponseMessage>(() =>
                {
                    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                    response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

                    string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
                    if (accessControlRequestMethod != null)
                    {
                        response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
                    }

                    string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
                    if (!string.IsNullOrEmpty(requestedHeaders))
                    {
                        response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
                    }

                    return response;
                }, cancellationToken);
            }
            else
            {
                return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
                {
                    HttpResponseMessage resp = t.Result;
                    resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
                    return resp;
                });
            }
        }
        else
        {
            return base.SendAsync(request, cancellationToken);
        }
    }
}

暫無
暫無

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

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