2014-03-13 2 views
0

webAPI에 익숙하지 않으며 웹 API에 CORS (Cross Origin Resource Sharing)를 구현하려고합니다. 나는 이것을 Microsoft link이라고 말하고있다. 그들은WEBAPI의 CORS 구현 - .net framework 4.0

PM> Install-Package Microsoft.AspNet.Cors -Version 5.0.0-rc1 -Pre 

을 사용하여 Nuget 패키지를 설치하지만 .NET Framework 4.0을 사용하고 있으며 작동하지 않습니다. 나중에이 Nuget 명령을 사용했습니다.

Install-Package Microsoft.AspNet.WebApi -Version 4.0.20710 

그러나 CORS 클래스는 포함되어 있지 않습니다. CORS를 구현하는 다른 방법이 있습니까?

답변

3

나는 다음과 나를 위해 잘 작동합니다 ("4.0 클라이언트 프로파일"비트에 대해 확실하지 생각) 사용

public class CorsHandler : DelegatingHandler 
{ 
    private const string Origin = "Origin"; 
    private const string AccessControlRequestMethod = "Access-Control-Request-Method"; 
    private const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; 
    private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; 
    private const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; 
    private 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) 
      { 
       var 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); 
       } 

       var tcs = new TaskCompletionSource<HttpResponseMessage>(); 
       tcs.SetResult(response); 
       return tcs.Task; 
      } 

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

하는 응용 프로그램 시작 (Global.asax에 광산) 당신에 등록하는 것을 잊지 마십시오

GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler()); 
+0

나는 user3409920에서 설명한 것과 같은 문제에 직면하고 있습니다. 귀하의 솔루션을 시도하는 동안 그것은'return base.SendAsync (...)'진술에 StackOverFlow 예외를 throw합니다. if (isCorsRequest). 그걸 해결하는 것에 대해 어떤 생각이 있습니까 ?? –

+0

안녕하세요, 위의 이러한 return 문 중 하나만 사용해보십시오. 보시다시피 첫 번째 메시지는 헤더를 함께 반환하고 다른 메시지는 반환하지 않습니다. 귀하의 의견을 알려주십시오. 건배 – felipekm

0

CORS 패키지가 그것은 당신이 .NET을 사용하는 웹 API 1 (사용할 수 없습니다 2014

4.5 및 Visual Studio/특급 .NET 프레임 워크를 필요로 웹 API이 지원됩니다 4.0)

this thread을 참조하십시오.

+0

주어진 스레드의 중요한 정보를 여기에 포함 시키면 더 좋을 것입니다. – niyasc