[英]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,如果成功,則發送實際請求PUT
或POST
或Delete
。 由於您沒有處理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.