2012-01-11 30 views
5

Tôi có một dịch vụ JSON WCF và tôi đã viết một số javascript để truy cập dịch vụ như thế này,Dịch vụ WCF Không Với Phương pháp không được phép

function stuffClick2() { 
     $.ajax({ 
      url: "http://192.168.54.98/JsonWCFService/Service1.svc/Post", 
      type: "POST", 
      contentType: "application/json", 
      data: '{"x":"1","y":"2","message":"The answer is: "}', 
      dataType: "html", 
      success: function(data) { $('body').html(data); }  
     }); 
    } 

Tôi đã viết một trang HTML trong đó có các javascript trên trong nó. Trang HTML được phân phát bằng IIS.

Khi tôi truy cập vào trang HTML bằng chrome trên máy tính của tôi, tôi thấy các hoạt động này được gửi đến các dịch vụ WCF JSON theo thứ tự này,

OPTIONS /JsonWCFService/Service1.svc/Post HTTP/1.1 
POST /JsonWCFService/Service1.svc/Post HTTP/1.1 

các tùy chọn đã thất bại trước đó, nhưng tôi đã OPTIONS gọi trở lại tiêu đề này mà sau đó làm cho nó hoạt động,

Access-Control-Allow-Origin: * 

Nhưng khi gọi lại tôi đã định nghĩa ở trên không hoạt động,

success: function(data) { $('body').html(data); } 

Tôi biết rằng các dịch vụ WCF đã trở lại một cái gì đó như thế này,

<b> The answer is 3 </b> 

Nhưng khi gọi lại được gọi là giá trị của dữ liệu là một chuỗi rỗng.

Khi tôi chạy trang html trong một trình duyệt khác (IE) mà chỉ gây ra một cuộc gọi POST, nhưng không phải là một cuộc gọi OPTIONS thì nó hoạt động. Tôi nhận thấy rằng IE cảnh báo tôi rằng nó đặt ra một nguy cơ bảo mật và hỏi tôi có muốn tiếp tục không.

Trả lời

6

Tôi đã gặp vấn đề này khi cố gắng triển khai CORS với WCF cho ứng dụng HTML di động mà tôi đã tạo. OPTIONS là một yêu cầu preflight để xem một phương thức có sẵn trước khi gọi nó hay không.

Dưới đây sẽ là vấn đề của bạn:

  1. OPTIONS là, tôi nghĩ rằng, defaultly tắt bởi IIS. Có thể là điểm bắt đầu ở đây: http://www-jo.se/f.pfleger/cors-and-iis
  2. Động từ OPTIONS sẽ chuyển sang phương thức POST thực tế của bạn, do đó bạn sẽ muốn có thứ gì đó trong bộ lọc WCF OPTIONS cho phương thức khác với cùng kiểu trả về không có gì. Và lọc động từ POST sang phương thức thực tế của bạn. Nếu bạn không làm điều này, bạn sẽ tìm thấy hành vi kỳ lạ của một trong hai phương pháp của bạn được gọi là hai lần hoặc nó sẽ ném một ngoại lệ webservice mơ hồ.

Không chắc chắn nếu bạn đang sử dụng CORS hay không, nhưng hiệu trưởng sẽ giống nhau, vì nó gửi yêu cầu OPTIONS sau đó yêu cầu POST.

+0

Bạn đang đi đúng hướng, nhưng thật kỳ lạ bởi vì tất cả đều hoạt động cho tôi sớm hơn trong ngày. – peter

+0

OK, vì vậy tôi đã có các tùy chọn làm việc (bằng cách thêm một số mã trong phương thức Application_BeginRequest để trả về các tiêu đề mà OPTIONS đang yêu cầu). Vì vậy, bài đăng sau đó xảy ra sau đó, nhưng tôi nhận được một lỗi từ XMLHttpRequest - null gốc là không được phép. Vì vậy, nó có vẻ như tiêu đề nó được sử dụng trong bài viết là 'Origin: null' tôi có thể thấy nó trong fiddler. Tại sao điều này? – peter

+0

Nếu tôi xem các hoạt động đăng bài hoạt động, không có tiêu đề gốc nào được chỉ định. điều này giải thích tại sao nó hoạt động. – peter

1

Cảm ơn câu trả lời của bạn đã đặt tôi vào con đường giải quyết vấn đề.

Khi tôi truy cập vào trang HTML với javascript ajax trong đó tôi đã sử dụng,

http://localhost/file.html 

Nhưng nếu bạn nhìn vào javascript nó được tiếp cận các dịch vụ WCF sử dụng,

http://192.168.54.98/JsonWCFService/Service1.svc/Post 

Nếu tôi đặt chúng cả hai

http://mymachinename.domain.com/JsonWCFService/Service1.svc/Post 
http://mymachinename.domain.com/file.html 

Sau đó, nó hoạt động mà không cần phải gọi một hoạt động OPTIONS .

Điều đó không giải thích tại sao OPTIONS và sau đó POST từ chrome không hoạt động. Chrome dường như bỏ qua kết quả.

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