2013-07-04 4267 views
11

Tôi có một trang web với REST Api và bây giờ tôi đang tạo một tiện ích mở rộng cho trình duyệt, sẽ thu thập dữ liệu từ một số trang và gửi lại cho REST Api. Bởi vì tôi muốn phần mở rộng của tôi tương thích với cả firefox và chrome, và để dễ bảo trì, tôi sẽ chèn mã thực tế vào trang dưới dạng thẻ tập lệnh, sau đó được thực thi như javascript bình thường. Tôi hiện chỉ đang hoạt động trên phiên bản phần mở rộng của chrome và tôi gặp sự cố:Yêu cầu PATCH trên Chrome Cross-Domain không hoạt động

Khi tôi đang cố gắng gửi dữ liệu đến api (yêu cầu PATCH), chrome sẽ không để tôi nói :

XMLHttpRequest không thể tải http://my.rest/api. Xuất xứ http://website.com không được cho phép bởi Access-Control-Allow-Origin.

Tôi có Access-Control-Allow-Headers, Methods và Origin đều được đặt thành giá trị phù hợp nhưng vẫn không hoạt động. Tuy nhiên, nó hoạt động với các yêu cầu GET. Tôi cũng đã thử POST và PUT yêu cầu nhưng những người không làm việc hoặc.

Dưới đây là tiêu đề của tôi:

Yêu cầu:

OPTIONS /some/api/path HTTP/1.1 
Host: my.rest 
Connection: keep-alive 
Access-Control-Request-Method: PATCH 
Origin: http://website.com 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 
X-FireLogger: 1.1 
Access-Control-Request-Headers: accept, x-http-auth-user, x-http-auth-token, origin, content-type 
Accept: */* 
Referer: http://website.com/index.php 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: cs-CZ,cs;q=0.8 

đáp ứng:

Access-Control-Allow-Headers:accept, x-http-auth-user, x-http-auth-token, origin, content-type 
Access-Control-Allow-Methods:PATCH 
Access-Control-Allow-Origin:* 
Connection:Keep-Alive 
Content-Type:text/html; charset=utf-8 
Date:Thu, 04 Jul 2013 10:50:08 GMT 
Keep-Alive:timeout=5, max=100 
Server:Apache/2.4.2 (Win64) PHP/5.4.3 
X-Frame-Options:SAMEORIGIN 
X-Powered-By:Nette Framework 

Tôi đã cũng cố gắng thiết lập Access-Control-Allow-Origin chính xác cùng một giá trị như xứ tiêu đề, nhưng nó không hoạt động. Furthemore nó có vẻ là làm việc trong Firefox. Tôi có Chrome 27, phiên bản này sẽ được cập nhật.

+0

thử thêm '--disable-web-security' này –

+1

Tôi không phát triển phần mở rộng này cho bản thân mình và tôi không thể hỏi những người muốn sử dụng nó để làm điều này. – hynner

+0

bạn đang sử dụng [jsonp] (http://en.wikipedia.org/wiki/JSONP)? –

Trả lời

6

tôi phải đối mặt với vấn đề tương tự trong Node.js với CORS

Bạn cần phải đặt 'Access-Control-Allow-Origin' để lĩnh vực cụ thể không phải là một ký tự đại diện

Ví dụ: 'Access-Control -Cho phép-Origin' thành 'http://website.com'

(bạn có thể có trên máy chủ của bạn một loạt các nguồn gốc cho phép và kiểm tra đối với các yêu cầu nếu nó được cho phép sau đó trả lời với một thay vì ký tự đại diện)

Ngoài ra bạn có thể thiết lập 'Access-Co Tiêu đề vào một danh sách các tùy chọn như:

'Phương pháp ntrol-Allow-POST, GET, OPTIONS, DELETE, PUT'

+0

Như tôi đã viết trong câu hỏi của mình, tôi đã thử đặt giá trị đó thành cùng một giá trị với tiêu đề Gốc không có may mắn. Theo ký tự đại diện đặc biệt nên được cho phép. Việc đặt Access-Control-Allow-Methods thành nhiều giá trị cũng không giúp được gì. – hynner

6

bạn nên cho phép OPTIONS trong phần đầu trả lời của bạn ..

"Access- Control-Allow-Methods "," GET, POST, HEAD, OPTIONS, PUT, DELETE "

+0

Tôi đã cho phép ngay bây giờ, nhưng nó vẫn không giúp được gì. – hynner

+0

và cũng cho phép PATCH như cũ ... tôi nghĩ rằng bạn đã thêm –

+0

yeah PATCH được phép, đọc nhận xét của tôi về câu hỏi chính, nó hoạt động ngay bây giờ, nhưng tôi không chắc chắn tại sao :-) – hynner

0

Tôi đã thử CORS trên Chrome 27.0.1453.116 và nó đã hoạt động đối với tôi. Từ phía khách hàng, tất cả những gì tôi đã làm là trong AJAX jquery đặt 'crossDomain' thành đúng.

$.ajax('http://localhost/Elements.Services/Elements.svc/REST/Element/Get?ID=1', { 
        type: 'GET', 
        crossDomain: true, 
        success: function (data) { 
         alert(data); 
        } 
       }); 

Trong khi đứng về phía dịch vụ REST cho mỗi yêu cầu thiết lập các tiêu đề phản ứng sau:

  1. ("Access-Control-Allow-Headers", "Chấp nhận") hoặc ("Access- Control-Allow-Headers "HTTPRequest.RequestedHeaders + "Chấp nhận")

  2. ("Access-Control-Allow-Phương pháp", "POST, PUT, GET")

  3. (" Một ccess-Control-Allow-Origin "," * ")

Here là bài viết tuyệt vời về CORS đang hoạt động, điều này thực sự đã giúp tôi.

+0

Như tôi đã nói trong câu hỏi, GET đã làm việc tốt cho tôi quá, nhưng các yêu cầu khác đã gây ra một vấn đề. – hynner

+0

Tôi đã thử với POST là tốt và nó hoạt động tốt, mặc dù không phải với PUT/DELETE. –

+0

Bạn đã thử thêm tiêu đề tùy chỉnh chưa? Thật khó để nói, tôi không nói nó không nên làm việc, bởi vì nó nên. Tôi chỉ nói rằng nó không làm việc cho tôi và bây giờ nó hoạt động. – hynner

0

Trong WebAPI của bạn:

Thêm các Microsoft.AspNet.WebApi.Cors NuGet gói cho dự án

Hãy chắc chắn rằng bạn cũng CORS đăng ký hỗ trợ hoặc toàn cầu, tại Controller, hoặc tại Hành động.

toàn cầu - Trong WebApiConfig.cs bạn tập tin từ App_Start thư mục add:

public static void Register(HttpConfiguration config) {

// New code: var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors);

// Other configurations

}

khiển hoặc Hành động - Nếu muốn/cần thiết để đặt hỗ trợ tại các mức (này sẽ ghi đè lên các thiết lập toàn cầu - Hành động> Bộ điều khiển> Config). Trên điều khiển hoặc hành động chữ ký:

[EnableCors(origins: "http://localhost:[*port #*]", headers: "*", methods: "*")]

Lưu ý: * là "ký tự đại diện", có thể muốn đặt tên miền đưa ra yêu cầu ví dụ: (http://localhost:[cổng #])

Cái gì đó rất dễ bỏ sót/quên ...

IN explorer solution, nhấp chuột phải vào api-project. Trong cửa sổ thuộc tính đặt 'Xác thực ẩn danh' thành Đã bật !!!

0

lý do tại sao không chỉ sử dụng PUT thay vì PATCH và loại yêu cầu của bạn.Họ cũng làm điều tương tự

Các vấn đề liên quan