RadAsyncUpload有時無法上傳

接獲報案,使用Telerik RadAsyncUpload上傳元件的WebForm網頁有時成功有時失敗,上傳失敗的檔案多試幾次有時會成功,用多台機器測試失敗率有高有低,難以捉摸。使用F12開發者工具檢視,錯誤發生在瀏覽器以POST傳送包含檔案內容的multipart/form-data資料到/MyWeb/Telerik.Web.UI.WebResource.axd?type=rau,但伺服器端傳回{ "message" : "RadAsyncUpload handler is registered succesfully, however, it may not be accessed directly." }。

由於檔案上傳時好時壞,初步排除RadAsyncUpload Handler安裝或註冊問題。反覆實驗多次,由蒐集到的成功及失敗案例,歸納出一個關鍵現象:當Request Header出現Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAH…就會失敗;Request Header未包含Authorization則會成功。

依經驗,瀏覽器之所以回傳Authorization Header,在於回應伺服器端的驗證要求,由於F12開發者工具的網路擷取功能不包含供認證細節。到了HTTP茶包重兵器表現的時刻-Fiddler登場!

用Fiddler側錄上傳成功與失敗的網路傳輸,馬上看出關鍵差異。

上圖的編號46跟47是一次失敗上傳,第一次伺服器HTTP 401要求瀏覽器提供登入認證,第二次的Request增加Authorization Header,伺服器回傳HTTP 200,但在這個情況下,RadAsyncUpload Handler未正確接收上傳檔案,吐回錯誤。(透過反組譯追進RadAsyncUpload Handler,當 Request.Files.Length == 0 就會傳回 …it may not be accessed directly 訊息)

編號50則是一次成功上傳,Request不包含Authorization Header,伺服器爽快傳回HTTP 200,完成上傳動作。

有了這個線索,鎖定IIS認證方向偵辦:網站採用Windows驗證,依觀察結果研判Telerik.Web.UI.WebResource.axd在Windows驗證模式運作不正常。(但我無法解釋同樣是不含Authorization Header的Request,為何有時收到401,有時會收到200?)

在網路上查到一些開放WebResource.axd匿名存取的做法(參考),情境不完全相同但原理類似,官方建議在web.config加入以下設定:

<location path="Telerik.Web.UI.WebResource.axd">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

設定匿名存取後問題排除。留下一個謎團:同樣未傳Authorization Header,為何有時WebResource.axd要求登入認證,有時又能直接傳回結果?先歸入X檔案,日後再破解。

歡迎推文分享:
Published 22 December 2015 09:54 PM 由 Jeffrey
Filed under:
Views: 2,009



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2015>
SunMonTueWedThuFriSat
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication