×
新网 > 云服务器 > 正文

解答HTTP服务器中遇到的问题

  • 作者:新网
  • 来源:新网
  • 浏览:100
  • 2018-04-25 16:27:27

基于HttpListener手写服务器并不是很难。这个过程中小编是基于早期写的一个Server雏形,项目名为 Kserver。接下来小编就和大家说说Kserver的调用。 在KServer_OnRequest中处理正常的HTTP请求,在KServer_OnError中处理程序错误,通常会返回HTTP 500给客户端。这个程序启动后占用 6600 端口,然后在 Apache 配置了反向代理。但是写Cookie始终不成功。

 基于HttpListener手写服务器并不是很难。这个过程中小编是基于早期写的一个Server雏形,项目名为 Kserver。接下来小编就和大家说说Kserver的调用。

<div

3f469a61354d28eb7d8f69459d050ff1.png
在KServer_OnRequest中处理正常的HTTP请求,在KServer_OnError中处理程序错误,通常会返回HTTP 500给客户端。这个程序启动后占用 6600 端口,然后在 Apache 配置了反向代理。但是写Cookie始终不成功。
 
我设置Host为req.Url.Host。这个在本机是不会有问题的,单独在服务器中使用80端口也不会有问题,有问题的是即便通过反向代理,获取 Headers 中 的Host值始终还是 localhost,要通过X-Forwarded-Host才可以,这个大学时好歹了解过,平时开发全部基于IIS,没有反向代理,头一回遇到。
 
接下来就是模板引擎了,不用Razor了,说真的对Razor渐渐的没啥好感了,感觉挺笨重,所以选用了DotLiquid,用Liquid做模板引擎的应用可以说是非常多了。于是扩展了String类,增加了Html模板文件渲染 Html 的方法。
 
RenderBody 是模仿 Razor 搞的个关键字,表示是子页显示内容的区域。对于字体、脚本(第三方)、图片这些静态资源,我的想法是既然不会有大的变动,就让他永久缓存在浏览器好了。其他的就是处理POST,处理Cookie 了。HttpListenerRequest 是没法获取 Form 表单的值的,只能读取 InputStream 中的值,然后自己根据键值对获取了。Cookie 是不能简单的通过键值对分割,查询值按照等号分割没关系,因为 Value 都是编码了的,不会含有等号,但是 Cookie 中是可能会有等号的,比如 Base64 编码过的值里,大部分都有。同样,获取 Cookie 的方法也木有,自己从 Header 里找吧。接下来模拟登陆成功后的跳转,用过Asp.net 的知道有个Response.Redirect不过 HttpListenerRequest 肯定是没有这个方法的,可以通过设置 Header 302 重定向就行了。
 
对于较大的页面,也许还是希望用Gzip压缩一下,需要设置 Content-Encoding 为 Gzip。我这里处理比较简单,是不管客户端的 Accept-Type 的,不过现代浏览器基本都支持了。
 
对相应内容进行压缩:
 
既然是纯 C#,没有了 WebForm 和 MVC 这类框架,分页处理也显得不简单了,从网上改造了一个 PHP 写的分页类,果然 PHP 是最好的语言。这不是取数据时的分页,而是显示时候的分页。
 
用 SimpleMDE 作为 Markdown 编辑器,,谁用谁知道,对于富文本的排版,我始终无能为力,Word 也不会用,markdown 真好用!SimpleMDE 是没有上传图片的功能,需要自己处理,不过自定义按钮官方文档中有,我只是做了写微小的工作,为按钮加个选图片和上传的事件,这需要 jQuery 和 jQuery.Form 的支持。如果你的接口是外部服务或者阿里OSS,要记得设置跨域,不然报错,这个搞过开发的都懂得。最初版本的后台 Markdown 渲染用的 Github 上的 star 最多的那一个 Markdig,在 CentOS 7 下 mono 环境运行报错,换了 CommonMark 使用,这个在 Nuget 上能找到。最终的最终,把所有资源都打包进了资源文件,用 ILMerge 合并程序集,你的服务端就只剩下一个 EXE 了。
 
以上就是小编的今日分享,希望对您有所帮助。
 

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading