2014-10-22 13 views
8

Tôi cần bật CORS cho API Web của mình và tôi không thể nâng cấp lên Framework 4.5 vào lúc này. (Tôi biết về System.Web.Http.Cors.EnableCorsAttribute.)Bật CORS cho API Web 1, .net 4.0

Tôi đã cố gắng để thêm dòng sau vào Web.config của tôi để xem nếu nó làm việc, nhưng nó đã không được phép:

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

Tôi cũng đã cố gắng đặt tiêu đề Access-Control-Allow-Origin thành "*" theo cách thủ công bằng cách sử dụng System.Web.Http.Filters.ActionFilterAttribute (dựa trên bài đăng này: Add custom header to all responses in Web API) - nhưng điều đó không thành công hoặc khi yêu cầu bị từ chối trước khi nó được đưa vào bộ lọc hành động.

Vì vậy, hiện tại tôi đang bị kẹt .. Bất kỳ trợ giúp nào đều được đánh giá cao.

Edit: Hóa ra

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

là câu trả lời tất cả cùng, tôi có lẽ đã làm điều gì đó sai trước khi tôi thử nghiệm nó. Nhưng giải pháp này có nghĩa là tất cả các hành động đều được kích hoạt CORS (sẽ được thực hiện ngay bây giờ).

+0

thể trùng lặp của [Tài nguyên yêu cầu không không hỗ trợ phương thức http 'GET'. Mã lỗi 405] (http://stackoverflow.com/questions/26487126/the-requested-resource-does-not-support-http-method-get-error-code-405) –

+0

@ArindamNayak Câu trả lời được chấp nhận trong chuỗi đó dường như yêu cầu .NET Framework 4.5. – nednull

+0

làm một việc, làm theo, các bước được đề cập trong câu trả lời ở đó, và bạn có thể phải tìm gói .net 4 nuget để làm cho nó hoạt động. Lưu ý: Tôi đã trả lời ở đó, vì vậy tôi không trả lời ở đây, tôi có nghĩa là không làm một bản sao của điều đó. –

Trả lời

7

cố gắng thêm cũng:

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

nơi để thêm này, tôi đã cố gắng thêm vào cấu hình web, nhưng không làm việc –

+0

@ Md.ParvezAlam thêm nó vào web.config https://gist.github.com/walkermatt/637df93121a409faab6a –

+0

Tôi đã làm, nhưng không có công việc –

9

POST, PUT, DELETE, vv sử dụng CORS trước flighted. Trình duyệt gửi yêu cầu OPTIONS. Điều này là do trình duyệt đầu tiên, kiểm tra xem máy chủ có thể xử lý CORS hoặc không sử dụng yêu cầu OPTIONS, nếu thành công, sau đó gửi yêu cầu thực tế PUT hoặc POST hoặc Delete. Vì bạn không có một phương thức hành động xử lý OPTIONS, bạn đang nhận được 405. Ở dạng đơn giản nhất của nó, bạn phải thực hiện một phương thức hành động như thế này trong bộ điều khiển của bạn.

Nhiều lời giải thích - 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; 
} 

Lưu ý: Đây hành động này chỉ đáp ứng OPTION yêu cầu, vì vậy cùng với điều này bạn cần phải thêm cấu hình cần thiết để web.config, chẳng hạn như Access-Control-Allow-Origin = *Access-Control-Allow-Methods = POST,PUT,DELETE.

Web API 2 có hỗ trợ CORS, nhưng với API Web 1, bạn phải đi theo đường dẫn này.

-1

tôi đã phải đối mặt với rất nhiều vấn đề với WebAPI 1 Chữ thập truy cập miền cuối cùng có thể sửa chữa nó có một cái nhìn tại blog của tôi http://keerthirb.blogspot.in/2017/08/making-cross-enable-for-webapi1.html

đang Cross là

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); 
     } 
    } 
} 
+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/16926887) – Paddy

+0

Tôi đồng ý Vì vậy, tôi đã bao gồm mã kích hoạt chéo. Để biết thêm thông tin, người dùng có thể truy cập liên kết. –