2011-10-21 27 views
7

Tôi đang chạy vào một vấn đề lạ với một cuộc gọi webservice crossdomain trong Silverlight 4.clientaccesspolicy.xml không yêu cầu lần đầu tiên trong một số trình duyệt

Ngay sau khi bắt đầu, các ứng dụng gọi một webservice trên cùng một máy chủ từ nơi nó đã được tải xuống nhưng trên một cổng khác (ví dụ: ứng dụng nằm ở http://www.mydomain.com:80 và webservice là http://www.mydomain.com:81). Không có SSL liên quan. Máy chủ lưu trữ cung cấp tệp clientaccesspolicy.xml thích hợp và mọi thứ hoạt động chính xác hầu hết thời gian (như 99,9%).

Tuy nhiên, trong một số trường hợp, trình duyệt không yêu cầu clientaccesspolicy.xml và kết quả là cuộc gọi webservice bị chặn và không thành công với lỗi tên miền chéo.

Trong trường hợp điển hình này là chuỗi các yêu cầu mà bạn nhìn thấy với Fiddler hoặc Chrome công cụ phát triển:

  • index.html (trang lưu trữ các ứng dụng Silverlight)
  • silverlight.js
  • ứng dụng .xap
  • clientaccesspolicy.xml (yêu cầu và tải về một cách chính xác)
  • gọi webservice

Trong một số trường hợp tuy nhiên bạn chỉ nhìn thấy

  • index.html (trang lưu trữ các ứng dụng Silverlight)
  • silverlight.js
  • application.xap
  • -> chéo lỗi miền (không clientaccesspolicy đã yêu cầu, không có cuộc gọi dịch vụ web).

này chỉ xảy ra trên một số ít máy (tất cả chạy Windows 7) nếu tất cả những điều kiện này là đúng:

  • ứng dụng đang chạy trong Chrome, Firefox hoặc out-of-the duyệt (IE luôn luôn làm việc)
  • lần đầu tiên bạn tải trang (tức là nếu bạn nhấn nút tải lại của trình duyệt vấn đề đi xa. trình duyệt Đóng/khởi động lại và lần đầu tiên bạn vẫn còn có vấn đề)
  • no Fiddler đang chạy (nếu bạn chạy lưu lượng truy cập thông qua Fiddler thì vấn đề sẽ biến mất). Công cụ nhà phát triển Chrome không có hiệu lực.
  • máy nằm trong tên miền giống với ứng dụng máy chủ. Nếu bạn truy cập trang từ một mạng bên ngoài (với cùng một máy), vấn đề không có ở đó.

Trên những máy đó, trong những trường hợp đó, sự cố là 100% có thể lặp lại.

Điều gì có thể gây ra điều này? Tôi có thể thực hiện các bước nào để theo dõi vấn đề?

Trả lời

11

Vấn đề này rõ ràng là khá hiếm, nhưng với một số trợ giúp từ Microsoft, tôi đã tìm ra giải pháp. Tôi đăng nó để tham khảo trong tương lai để hy vọng this sẽ không xảy ra nữa.

Là biện pháp bảo mật, Silverlight chặn bất kỳ cuộc gọi tên miền chéo nào giữa vùng Internet và vùng Intranet cục bộ. Trong trường hợp đó, nó thậm chí không yêu cầu clientaccesspolicy.xml. Vì vậy, nếu ứng dụng được lưu trữ trên www.myhost.com (vùng Internet), Silverlight ngăn cản anh ta gọi một webservice trên www.another.com (vùng Intranet cục bộ).

This blog post giải thích chi tiết.

Vì vậy, nếu bạn có một hoặc nhiều các triệu chứng sau đây (mặc dù đã loại bỏ các lỗi crossdomain hiển nhiên như một clientaccesspolicy.xml bị thay đổi hoặc bị thất lạc):

  • lỗi crossdomain từ một số máy dường như ngẫu nhiên (vị trí khác nhau/tên miền), nhưng hoạt động từ các máy khác
  • clientaccesspolicy.xml không được yêu cầu ở tất cả
  • hoạt động với một số trình duyệt, không hoạt động với một số trình duyệt khác. Dường như ngẫu nhiên, đôi khi không hoạt động với bất kỳ trình duyệt nào.
  • đôi khi không có vấn đề khi Fiddler là mở, nhưng lỗi không Fiddler chạy
  • mọi thứ hoạt động một cách chính xác trên localhost

Nó có thể là giá trị để cố gắng điều sau đây, để đưa các máy chủ ứng dụng và dịch vụ web trong khu vực an ninh tương tự:

  • đi để thiết lập bảo mật IE (các thiết lập này cũng được sử dụng bởi bất kỳ ứng dụng truy cập mạng, tức là bất kỳ trình duyệt khác cũng)
  • thêm tiện ích ress nơi đặt máy chủ ứng dụng và địa chỉ mà chủ các webservice đến Intranet Local trang web HOẶC
  • bỏ chọn "Tự động phát hiện mạng intranet" cờ (để họ cả kết thúc trong vùng Internet)
+1

Tôi có thể hôn bạn. –

+1

Tôi cũng muốn hôn bạn. Điều này giải quyết được một vấn đề đã ngăn cản chúng tôi di chuyển về phía trước với IIS Smooth Streaming. – theChrisKent

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