簡體   English   中英

CORS、IIS——有史以來最奇怪的失敗

[英]CORS, IIS - the strangest failure ever

我有一個 Microsoft IIS 服務器(通過 TMG 防火牆)。 我有 Apache 服務器(不同的位置,沒有防火牆)。 我的 IIS 服務器提供數據文件(純文本,實際上 - CSV)。

Apache 服務器提供簡單的 HTML 頁面,該頁面通過jQuery.ajax()方法從 IIS 服務器加載數據。 或者,IE8 上的XDomainRequest()或者 9。(作為$.ajax傳輸)。

這是我的包含數據的目錄的 web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <location path=".">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET,POST" />
          <add name="Access-Control-Allow-Headers" value="Content-Type" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
</configuration>

這是測試:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>CORS TEST</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
        <script>
            $(function () {
                var h2 = $('h2:first');
                    h3 = $('h3:first');
                h3.text(navigator.userAgent);
                $.ajax({
                    url : '//my.iis.site.net/ajax/data/test.csv',
                    method : 'GET'
                })
                .done(function() {
                   h2.text('WORKS.'); 
                })
                .fail(function() {
                   h2.text('FAILED.'); 
                });
            });
        </script>
    </head>
    <body>
        <h1>CORS TEST:</h1>
        <h2></h2>
        <h3></h3>
    </body>
</html>

我使用所有支持 CORS 的指定瀏覽器對其進行了測試。 還有一些移動設備。 我不能讓它失敗。 它只是有效,一切都在書中。

在與我們的工作團隊一起測試此配置后,我們發現可以將我們的新站點提供給更廣泛的受眾。 就在這時,一切都崩潰了。

大多數人都說它有效。 但是相當多(絕對超過 10%)的人說它不起作用。 恐怕超過10%,甚至有可能達到50%。

這是最糟糕的情況:2 個人,但幾乎(或完全)相同的軟件(操作系統、配置、程序、ISP、瀏覽器)。 一個人看到 AJAX 數據,另一個人看不到。

相同的操作系統,相同的瀏覽器(在兩台計算機上使用 3 種不同的瀏覽器進行測試,完全相同的版本和相同的 ISP)。

在某些計算機上,CORS 無論如何都不起作用!

是的,他們清除了所有瀏覽器緩存。 沒有幫助。

瀏覽器不會在控制台中拋出任何錯誤, $.ajax()方法只是觸發.fail()方法,而不是.done() 我不知道如何測試它,因為在我的機器上它總是有效。 即使在我所有的移動設備和 GSM 網絡上,它也很有魅力。 即使在相當舊的 Android 版本和相當舊的默認瀏覽器上。 無論我做什么都不能讓它失敗,就像有些人不能讓它在他們的任何計算機或移動設備上運行一樣。

這是什么邪惡的魔法? 我應該忘記 CORS 並切換到 JSONP 傳輸嗎?

我不使用 JSONP 是有原因的。 數據服務器將收到巨大的流量。 數據每 500 毫秒更新一次,並且會經常被成千上萬的用戶重新加載(即使以 500 毫秒的速度)。 在我的 IIS 服務器上對每個請求執行腳本並不是最好的主意。 它可能會對性能產生相當負面的影響。

有什么線索嗎? 將數據壓縮為 PNG 並通過 JS 解壓縮? :) 這是一個瘋狂的黑客。 CORS 並不瘋狂,但這就是我所得到的。

知道如何開始測試嗎? 也許這是 jQuery 中的一個錯誤,但我對此表示懷疑。 即使請求腳本是從同一域運行的,無法通過 CORS 訪問文件的人也無法訪問它們。 我必須刪除 web.config 才能使 AJAX 在同一個域上工作。

如果將 web.config 文件放在 Web 應用程序的子目錄中,則必須將該子目錄轉換為 IIS 管理器中的應用程序。 否則,它會為對該子目錄的每個請求提供錯誤 500。

有人在一台服務器上將其轉換為 Web 應用程序,但在另一台服務器上卻沒有。 這就是為什么一些用戶得到數據,而一些錯誤 500 而不是數據。

確保您的客戶端不在代理服務器或防火牆后面.. 某些代理服務器或防火牆可能會阻止或自動響應預檢選項請求..

同樣在你的服務器 web.config 文件的處理程序部分添加

<handlers>
      <remove name="OPTIONSVerbHandler" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM