2015-06-17 17 views
17

Tôi có một ứng dụng web sử dụng MVC và AngularJS, kết nối với api Web API 2 mà tôi đã thiết lập trong một dự án riêng biệt.HTTP Post to Web API 2 - Yêu cầu tùy chọn đã nhận và xử lý không yêu cầu thêm

Hiện tại tôi có thể truy xuất thông tin từ Api mà không gặp vấn đề gì.

Tuy nhiên khi tôi cố gắng đăng bài HTTP, tôi không nhận được phản hồi, ban đầu tôi gặp sự cố với yêu cầu trước chuyến bay, tôi đã xử lý yêu cầu này trong bộ điều khiển của mình, tuy nhiên nó không gửi yêu cầu thích hợp sau khi nó đã nhận được một tin nhắn OK trở lại.

Tôi đã bao gồm mã của mình cho Nhà máy góc và Bộ điều khiển C# trong API.

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class RegisterController : ApiController 
{ 
    public string Post() 
    { 

     return "success"; 
    } 

    public HttpResponseMessage Options() 
    { 
     return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
    } 
} 


var RegistrationFactory = function($http, $q, ApiAddress) { 
return function(model) { 
    // $http.post(ApiAddress.getApiAddress() + '/Register/Post', model.ToString()); 

    $http({ 
     method: "POST", 
     url: ApiAddress.getApiAddress() + '/Register/Post', 
     data: model, 
     headers: { 'Content-Type': 'application/json; charset=utf-8' } 
    }).success(function(data) { 
     $location.path("/"); 
    }); 
} 
}; 

RegistrationFactory.$inject = ['$http', '$q', 'ApiAddress']; 

Edit:

tôi vẫn không có bất cứ niềm vui với điều này, tuy nhiên tôi đã thử nghiệm trong Internet Explorer và nó hoạt động không có vấn đề gì cả.

Tôi đã làm việc trong Chrome bằng cách bắt đầu với bảo mật web bị vô hiệu hóa, tuy nhiên rõ ràng đây không phải là lý tưởng vì nó sẽ không hoạt động trên máy tính người dùng có bảo mật được bật.

+0

Tính năng này có hoạt động trong Firefox không? – DermFrench

+0

Có, tôi nghĩ rằng đó là vấn đề liên quan đến bảo mật trong Chrome. –

+0

Bạn đã thử xuất bản lên một miền, ví dụ: web.domain.com và api.domain.com để xem liệu nó có hoạt động khi chúng ở trên cùng một tên miền không? – DermFrench

Trả lời

4

Tôi thấy rằng bạn đã thực hiện thích ứng cho CORS ở phía máy chủ. Nhưng tôi không thể nhìn thấy bất kỳ thích ứng phía khách (javascript) nào. Có thể bạn nên thêm mã dưới đây trước khi gọi dịch vụ.

$http.defaults.useXDomain = true; 
delete $httpProvider.defaults.headers.common['X-Requested-With']; 

Hãy cho tôi biết nếu điều này khắc phục được sự cố. Làm việc cho tôi trong mọi tình huống :).

Trân Himanshu

+0

Bạn _may_ cũng cần thêm '$ httpProvider.defaults.withCredentials = true;' – glennanthonyb

1

Đó là lạ mà bạn GET làm việc, nhưng bài viết của mình thì không.

Tôi khuyên bạn nên chạy mã trong Google Chrome với bảo mật web đã bật (để chúng tôi có thể xem lỗi) và với Tùy chọn nhà phát triển F12 được hiển thị.

Chọn tab Mạng, chạy mã của bạn và xem điều gì xảy ra khi POST được gọi.

Dịch vụ của bạn có trả về trạng thái "200 OK" hay một số giá trị khác không?

Có bất kỳ loại Phản hồi nào được trả lại không?

Có thể đáng thử điều này và thêm ảnh chụp màn hình của các kết quả trong câu hỏi ban đầu của bạn. Nó có thể giúp xác định nguyên nhân.

Tôi vẫn không có bất kỳ niềm vui nào với điều này, tuy nhiên tôi đã thử nghiệm trên Internet Explorer và nó hoạt động không có vấn đề gì cả.

Btw, bạn không có bất kỳ đăng nhập một lần thiết lập nội dung nào trong công ty của bạn, đúng không? Chúng tôi đã gặp sự cố khi IE hoạt động tốt, nhưng các trình duyệt khác không cho phép đăng nhập một lần. Chỉ cần một ý nghĩ ...

0

CORS yêu cầu một OPTIONS-preflight có tiêu đề HTTP trong phản hồi của nó cho trình duyệt biết liệu nó có được phép truy cập tài nguyên hay không.

Ví dụ: HTTP Response Headers:

Access-Control-Allow-Headers: authorization 
Access-Control-Allow-Origin: * 

Bởi vì bạn có một bộ xử lý tùy chọn tùy chỉnh trong điều khiển # C của bạn, có vẻ như những tiêu đề HTTP không được quay trở lại, dừng lại trình duyệt để thực hiện cuộc gọi sau khi preflight.

Tránh phương pháp Tùy chọn và bạn sẽ tốt.

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