在Web Service中使用ASP.net狀態(tài)保持(5)_Windows教程
An unhandled exception of type 'System.Net.WebException' occurred in system.web.services.dll
Additional information: The request failed with the error message:
--
Object moved to here.
發(fā)生了什么呢?原來HTTP請求收到的不是“200 OK”響應(yīng)。如果你熟悉HTTP協(xié)議,你或許可以從響應(yīng)中的HTML代碼中發(fā)現(xiàn)這是一個“302 Found”響應(yīng),這意味著該請求被重定向到超鏈接中指定的地址。返回HTML代碼是很明智的,這樣如果一個瀏覽器因為某些原因不支持重定向的話,它可以把代碼顯示出來,或者在重定向過程中顯示這些代碼直到重定向完成。注意到超鏈接中包含了一個有趣的字符串“(l2z3psnhh2cf1oahmai44p21)”,顯然,我們可以推斷這就是ASP.net的會話ID,它被嵌入了我們要重定向到的位置的URL中。在客戶端代理中,我們需要做的僅僅是重新發(fā)送請求到這個新的URL。
無須再在Win32 WinInet API編程中跋涉,我們可以直接找到proxy類的一個屬性允許自動重定向。用外行人的說法,就是如果我們接收到一個“302 Found”響應(yīng),就直接將請求重新發(fā)送到相應(yīng)中HTTP位置頭所指示的URL。當(dāng)Visual Studio.net的智能提示顯示proxy類的AllowAutoRedirect屬性時,我感到這東西真是機靈得可愛。我馬上就在代碼中加上如下一行:
proxy.AllowAutoRedirect = True
我認(rèn)為這仍然比創(chuàng)建一個CookieContainer類并關(guān)聯(lián)到proxy類要容易得多,于是我又一次運行程序。很不幸,我遭遇了如下異常(為了簡潔起見有所刪節(jié)):
An unhandled exception of type 'System.InvalidOperationException' occurred
in system.web.services.dll
Additional information: Client found response content type of 'text/html; charset=utf-8',
but expected 'text/xml'.
The request failed with the error message: …
如果你看到錯誤消息的內(nèi)容,你會發(fā)現(xiàn)你所看到的HTML頁面跟你瀏覽.ASMX文件的頁面一樣。問題是,為什么當(dāng)我傳送XML(以SOAP封裝了的形式)到Web Service服務(wù)器時它返回的卻是HTML代碼?結(jié)果證實,你并沒有在SOAP封裝中發(fā)送HTTP POST請求,而僅僅發(fā)送了一個簡單的沒有內(nèi)容的HTTP GET請求,因此你的Web Service服務(wù)端理所當(dāng)然地假設(shè)這個請求來自瀏覽器,于是它返回普通的HTML響應(yīng)。為什么會這樣呢?
如果你了解HTTP協(xié)議,你會發(fā)現(xiàn)一個HTTP客戶端在收到“302 Found”響應(yīng)時發(fā)送HTTP GET請求到響應(yīng)中指定的地址是合情合理的,即使初始請求是HTTP POST。這種方式下瀏覽器工作得很好,因為開始幾乎所有的請求都是HTTP GET類型的,只有當(dāng)你試圖傳遞數(shù)據(jù)到一個URL時,才會出現(xiàn)上述失敗的結(jié)果。
理由是在傳送的數(shù)據(jù)中可能包含潛在的敏感數(shù)據(jù),因此你需要確認(rèn)是否用戶真的想向新的資源傳送數(shù)據(jù)。顯然如果你轉(zhuǎn)向基于重定向設(shè)置的新地址,你就沒能確認(rèn)用戶是否真的允許將他們的數(shù)據(jù)發(fā)送到新的地址。因此數(shù)據(jù)并沒有被發(fā)送,而代之以簡單的HTTP GET請求。
Windows教程Rss訂閱服務(wù)器教程搜索
Windows教程推薦
- Windows Server 2008 DNS服務(wù)器新增功能
- 主流WEB服務(wù)器比較(4)
- Windows Server 2008之IIS 7中設(shè)置 FTP
- Windows7系統(tǒng)安裝Oracle數(shù)據(jù)庫圖文教程詳解
- 揭秘Windows 2008服務(wù)器數(shù)據(jù)安全
- Apache服務(wù)器的安全性及實現(xiàn)(1)
- Windows下Nginx + PHP配置
- 用反向代理技術(shù)保護Web服務(wù)器(2)
- 個人服務(wù)器架設(shè)全攻略(93)
- WINDOWS服務(wù)器安全設(shè)置教程:硬盤權(quán)限設(shè)置
- 相關(guān)鏈接:
- 教程說明:
Windows教程-在Web Service中使用ASP.net狀態(tài)保持(5)。