解答HTTP服務(wù)器中遇到的問(wèn)題
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-04-25 16:27:27
基于HttpListener手寫(xiě)服務(wù)器并不是很難。這個(gè)過(guò)程中小編是基于早期寫(xiě)的一個(gè)Server雛形,項(xiàng)目名為 Kserver。接下來(lái)小編就和大家說(shuō)說(shuō)Kserver的調(diào)用。
在KServer_OnRequest中處理正常的HTTP請(qǐng)求,在KServer_OnError中處理程序錯(cuò)誤,通常會(huì)返回HTTP 500給客戶端。這個(gè)程序啟動(dòng)后占用 6600 端口,然后在 Apache 配置了反向代理。但是寫(xiě)Cookie始終不成功。
基于HttpListener手寫(xiě)服務(wù)器并不是很難。這個(gè)過(guò)程中小編是基于早期寫(xiě)的一個(gè)Server雛形,項(xiàng)目名為 Kserver。接下來(lái)小編就和大家說(shuō)說(shuō)Kserver的調(diào)用。
<
div>
在KServer_OnRequest中處理正常的HTTP請(qǐng)求,在KServer_OnError中處理程序錯(cuò)誤,通常會(huì)返回HTTP 500給客戶端。這個(gè)程序啟動(dòng)后占用 6600 端口,然后在 Apache 配置了反向代理。但是寫(xiě)Cookie始終不成功。
我設(shè)置Host為req.Url.Host。這個(gè)在本機(jī)是不會(huì)有問(wèn)題的,單獨(dú)在服務(wù)器中使用80端口也不會(huì)有問(wèn)題,有問(wèn)題的是即便通過(guò)反向代理,獲取 Headers 中 的Host值始終還是 localhost,要通過(guò)X-Forwarded-Host才可以,這個(gè)大學(xué)時(shí)好歹了解過(guò),平時(shí)開(kāi)發(fā)全部基于IIS,沒(méi)有反向代理,頭一回遇到。
接下來(lái)就是模板引擎了,不用Razor了,說(shuō)真的對(duì)Razor漸漸的沒(méi)啥好感了,感覺(jué)挺笨重,所以選用了DotLiquid,用Liquid做模板引擎的應(yīng)用可以說(shuō)是非常多了。于是擴(kuò)展了String類,增加了Html模板文件渲染 Html 的方法。
RenderBody 是模仿 Razor 搞的個(gè)關(guān)鍵字,表示是子頁(yè)顯示內(nèi)容的區(qū)域。對(duì)于字體、
腳本(第三方)、圖片這些靜態(tài)資源,我的想法是既然不會(huì)有大的變動(dòng),就讓他永久緩存在瀏覽器好了。其他的就是處理POST,處理Cookie 了。HttpListenerRequest 是沒(méi)法獲取 Form 表單的值的,只能讀取 InputStream 中的值,然后自己根據(jù)鍵值對(duì)獲取了。Cookie 是不能簡(jiǎn)單的通過(guò)鍵值對(duì)分割,查詢值按照等號(hào)分割沒(méi)關(guān)系,因?yàn)?Value 都是編碼了的,不會(huì)含有等號(hào),但是 Cookie 中是可能會(huì)有等號(hào)的,比如 Base64 編碼過(guò)的值里,大部分都有。同樣,獲取 Cookie 的方法也木有,自己從 Header 里找吧。接下來(lái)模擬登陸成功后的跳轉(zhuǎn),用過(guò)Asp.net 的知道有個(gè)Response.Redirect不過(guò) HttpListenerRequest 肯定是沒(méi)有這個(gè)方法的,可以通過(guò)設(shè)置 Header 302 重定向就行了。
對(duì)于較大的頁(yè)面,也許還是希望用Gzip壓縮一下,需要設(shè)置 Content-Encoding 為 Gzip。我這里處理比較簡(jiǎn)單,是不管客戶端的 Accept-Type 的,不過(guò)現(xiàn)代瀏覽器基本都支持了。
對(duì)相應(yīng)內(nèi)容進(jìn)行壓縮:
既然是純 C#,沒(méi)有了 WebForm 和 MVC 這類框架,分頁(yè)處理也顯得不簡(jiǎn)單了,從網(wǎng)上改造了一個(gè) PHP 寫(xiě)的分頁(yè)類,果然 PHP 是最好的語(yǔ)言。這不是取數(shù)據(jù)時(shí)的分頁(yè),而是顯示時(shí)候的分頁(yè)。
用 SimpleMDE 作為 Markdown 編輯器,,誰(shuí)用誰(shuí)知道,對(duì)于富文本的排版,我始終無(wú)能為力,Word 也不會(huì)用,markdown 真好用!SimpleMDE 是沒(méi)有上傳圖片的功能,需要自己處理,不過(guò)自定義按鈕官方文檔中有,我只是做了寫(xiě)微小的工作,為按鈕加個(gè)選圖片和上傳的事件,這需要 jQuery 和 jQuery.Form 的支持。如果你的接口是外部服務(wù)或者
阿里云OSS,要記得設(shè)置跨域,不然報(bào)錯(cuò),這個(gè)搞過(guò)開(kāi)發(fā)的都懂得。最初版本的后臺(tái) Markdown 渲染用的 Github 上的 star 最多的那一個(gè) Markdig,在 CentOS 7 下 mono 環(huán)境運(yùn)行報(bào)錯(cuò),換了 CommonMark 使用,這個(gè)在 Nuget 上能找到。最終的最終,把所有資源都打包進(jìn)了資源文件,用 ILMerge 合并程序集,你的服務(wù)端就只剩下一個(gè) EXE 了。
以上就是小編的今日分享,希望對(duì)您有所幫助。