Włącz CORS for Web API 1, .net 4.0


Muszę włączyć CORS dla mojego interfejsu API sieci Web i nie mogę w tej chwili uaktualnić do frameworka 4.5. (Wiem o System.Web.Http.Cors.EnableCorsAttribute.)
Próbowałem dodać następujące elementy do mojego pliku Web.config, aby sprawdzić, czy działa, ale nie zadziałało:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>

Próbowałem też ręcznie ustawić nagłówek Access-Control-Allow-Origin na „*” za pomocą System.Web.Http.Filters.ActionFilterAttribute (na podstawie tego postu:

dodaj niestandardowy nagłówek do wszystkich odpowiedzi w interfejsie API sieci Web
https://coderoad.ru/20349447/) - ale to też nie zadziałało, ponieważ żądanie jest odrzucane, zanim przejdzie do filtrowania akcji.
Więc teraz trochę utknąłem ... Każda pomoc byłaby mile widziana.
Edycja: okazuje się
<add name="Access-Control-Allow-Origin" value="*"/>

taka była odpowiedź od samego początku, musiałem zrobić coś złego wcześniej, kiedy to testowałem. Ale ta decyzja oznacza, że ​​wszystkie akcje są włączone w CORS (co zostanie zrobione na razie).
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

POST, PUT, DELETE, itp. Używają wcześniej przelotowego CORS-a. Przeglądarka wysyła żądanie OPTIONS. Dzieje się tak, ponieważ przeglądarka najpierw sprawdza, czy strona serwera może obsłużyć CORS, czy nie używa żądania
OPTIONS
, jeśli się powiedzie, a następnie wysyła rzeczywisty
PUT
lub
POST
lub
Delete
. Ponieważ nie masz metody akcji, która obsługuje OPCJE, otrzymujesz 405. W najprostszej postaci powinieneś zaimplementować taką metodę akcji w swoim kontrolerze.
Więcej wyjaśnień -

http://www.w3.org/TR/cors/%23r ... uests
http://www.w3.org/TR/cors/%23r ... uests
http://www.html5rocks.com/bath/tutorials/cors
http://www.html5rocks.com/en/tutorials/cors/
/
public HttpResponseMessage Options()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}

Uwaga: ta akcja po prostu odpowiada na żądanie
OPTION
, więc wraz z nią należy dodać wymaganą konfigurację do
web.config
, na przykład
Access-Control-Allow -Origin = *
i
Access-Control-Allow-Methods = POST, PUT, DELETE
.
Web API 2
obsługuje CORS, ale w przypadku Web API 1 musisz podążać tą ścieżką.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

spróbuj dodać także:
<add name="Access-Control-Allow-Headers" value="*"/>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mam wiele problemów z międzydomenowym interfejsem webAPI 1 W końcu udało mi się to naprawić, zajrzyj na mojego bloga

http://keerthirb.blogspot.in/2 ... .html
http://keerthirb.blogspot.in/2 ... .html
Kod krzyżowy
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.Resu<
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
});
}
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się