2012-01-25 21 views
10

Tôi đang phát triển một ứng dụng trong đó các đoạn mã HTML và javascript được phân phối tới các máy khách khác nhau. Tôi có thể GET html/javascript khối bằng cách thêm dòng sau vào tập tin cấu hình web:các bài đăng trên miền chéo tới ứng dụng ASP.Net MVC

<system.webServer> 
<modules runAllManagedModulesForAllRequests="true" /> 
    <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
      <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 

này đang làm việc tuyệt vời cho làm GETS. Vấn đề tôi đang gặp phải là thực hiện POSTs cross domain bằng cách sử dụng jQuery:

 $.ajax(
    { 
     type: 'POST', 
     url: url, 
     crossDomain: true, 
     data: JSON.stringify(data), 
     dataType: 'json', 
     contentType: 'application/json', 
     success: function(responseData, textStatus, jqXHR) 
     { 
      alert('Success'); 
     }, 
     error: function (responseData, textStatus, errorThrown) 
     { 
      alert('POST failed.'); 
     } 
    }); 

Tôi sẽ có nhiều khách hàng sử dụng ứng dụng của tôi (hy vọng). Tôi đã nghĩ đến việc sử dụng proxy nhưng tôi không có quyền kiểm soát máy chủ của khách hàng nên tôi không thể cài đặt httpHandler để hoạt động như một proxy.

Bất kỳ đề xuất nào về cách tôi có thể POST dữ liệu json từ các máy khách khác nhau qua miền tới ứng dụng ASP.Net MVC của tôi?

Trả lời

5

Tôi fiddled với cuộc gọi ajax của tôi và nó dường như được làm việc (so sánh với các cuộc gọi ajax trên):

 $.ajax(
    { 
     type: 'POST', 
     url: url, 
     crossDomain: true, 
     data: data, 
     dataType: 'json', 
     success: function(responseData, textStatus, jqXHR) 
     { 
      alert('success'); 
     }, 
     error: function (responseData, textStatus, errorThrown) 
     { 
      alert('POST failed.'); 
     } 
    }); 

tôi gỡ bỏ "contentType: 'application/json" và "JSON.stringify (. ..) "các cuộc gọi và tôi có thể đăng lên máy chủ.

Tôi không chắc chắn cách giải thích lý do tại sao nó hoạt động. Bất kỳ ý tưởng? Có bất kỳ vấn đề bảo mật nào không? Tôi đang làm tất cả điều này trên máy tính xách tay của tôi. Tôi thiết lập 2 trang web khác nhau thông qua IIS 7. Điều này có tạo nên sự khác biệt không?

0

bạn có hai tùy chọn, trong kiểu dữ liệu, bạn có thể đặt văn bản hoặc jsonp thay vì json. và nếu bạn cung cấp cho chúng tôi và ví dụ về dữ liệu bạn đang gửi, điều này sẽ dễ dàng hơn.

Kính trọng

1

Khi bạn chỉ định thuộc tính crossDomain thành "true", thuộc tính dataType được đặt là jsonp. Bạn sẽ cần một cách để xử lý jsonp này tuy nhiên ở phía MVC. Bạn có thể muốn xem bài đăng stackoverflow sau đây: ASP.net MVC returning JSONP

2

Phản hồi JSONP nội bộ (loại mặc định cho yêu cầu tên miền chéo) được tìm nạp bằng cách tiêm thẻ <script>, trỏ đến URL. Do đó, chỉ có thể sử dụng phương thức GET với JSONP. Các phương thức khác sẽ bị bỏ qua và quay trở lại GET.

0

Nếu bạn có quyền kiểm soát đối với những thư viện JS bạn đưa vào, cách tốt nhất là sử dụng một trong nhiều thư viện liên lạc tên miền chéo. Ứng dụng (ứng dụng MVC trong trường hợp của bạn) sẽ phải có cấu hình để chấp nhận các yêu cầu như vậy, trong hầu hết các trường hợp, nó có nghĩa là có cùng một lib ở phía chấp nhận.

Điều tốt nhất tôi đã tìm thấy cho đến nay là EasyXDM. Không có nhiều hạn chế và tự điều chỉnh khả năng của trình duyệt. Nhưng bạn phải có nó trên cả hai ứng dụng nói chuyện với nhau.