分类: 程序开发

C#对HTTP报文进行基本的解析

接上文《C#实现将TCP包拼接为完整的HTTP报文》的应用,更进一步,我们需要解析HTTP报文以进行数据分析。 要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,按报头中提供的内容编码和字符集编码进行解压缩和解码 目前没有找到.Net框架内置的解析方法,理论上HttpClient等类在内部应该已经实现了解析,但不知为何没有公开这些处理方法。(亦或是我没找到) 那么只能自己来解析这些数据了。 我们先来看看这个经过gzip压缩的文本内容的HTTP报文: 这里提供一个老外写的简陋的解析类(已经过修改,原代码中存在一些严重BUG): public enum HTTPHeaderField { Accept = 0, Accept_Charset = 1, Accept_Encoding = 2, Accept_Language = 3, Accept_Ranges = 4, Authorization = 5, Cache_Contr...

更多

C#实现将TCP包拼接为完整的HTTP报文

接上篇《C#使用SharpPcap实现监听网卡TCP请求以获取所有HTTP访问的网址》场景,我们监听到的TCP包其实已经包含了HTTP请求的所有内容,但是它们是分段的,也就是说一个网页或文件会被截断成若干个TCP包分别发送。 那么如何拼合它们?这主要用到上篇中我们转换得到TcpPacket对象: //转换为TCP包 var packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var tcpPacket = TcpPacket.GetEncapsulated(packet); 先来看一下这一系列TcpPacket的数据: tcpPacket {[TCPPacket: SourcePort=9343, DestinationPort=80, Flags={ack[2733350940 (0xa2eba01c)]|psh}]} base {PacketDotNet.TransportPacket}: {[TCPPacket: SourcePort=9343, DestinationPort=80, Flags...

更多

C#使用SharpPcap实现监听网卡TCP请求以获取所有HTTP访问的网址

功能目标是监听系统内所有网络请求,并读获取请求的目标Url。 SharpPcap是基于WinPcap功能构建的类库,可以用于监听网络。 使用SharpPcap需要在系统中先安装WinPcap,否则执行时会报错说没有此模块。 WinPcap下载地址:http://www.winpcap.org/install/default.htm SharpPcap项目现在已经迁移到了Github,网址:https://github.com/chmorgan/sharppcap 下载源码并整合到项目中。 编写代码: class Program { private static Regex httpgetRegex = new Regex(@”GETs+([^srn]+)s+HTTP”); private static Regex hostRegex = new Regex(@”Host:s*([^srn]+)”); static void Main(string[] args) { var devices = SharpPcap.CaptureDeviceList.Instance; //遍历网卡设备...

更多

简单的网站激活器

众所周知,ASP.Net网站在初次访问或隔一段时间后再访问时,速度会非常慢,因为网站需要重新初始化,即使发布时选择了预编译功能,也还是难以让人满意。 解决此问题最简单的办法就是持续激活网站,避免网站资源被释放了,于是乎就用几行代码写了一个这样的小工具,在服务器中将其运行,就可以保持网站被持续激活了: 当然你也可以将其运行在客户机上,只需要修改配置文件“网站激活器.exe.config”中的网址即可持续激活远程网站。 程序代码极其简单: using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; namespace 网站激活器 { class Program { static void Main(string[] args) { var url= Conf...

更多

ASP.Net网站部署到Windows Server 2012的操作记录(含Web Deploy)

本文记录了部署ASP.Net网站程序到一个新的 Windows Server 2012 服务器的操作步骤,其中包含了Web Deploy的安装和配置步骤,配置好 Web Deploy 可以允许我们在 Visual Studio 中直接一键发布网站,省去了手工上传、覆盖的麻烦。 首先在远程服务器中添加角色和功能,到 服务器角色 步骤,选择“Web 服务器”: 多次点“下一步”按钮到 选择角色服务 步骤,选择“管理服务”。(这是安装 Web Deploy 所必备的) 然后勾选 安全性 相关的选项: 以及 常见HTTP功能 的相关选项: 最后还有 应用程序开发 的相关选项: 确认安装即可,经过一段时间等待后安装完毕: 接下来访问这个网址下载 Web平台安装器 :http://www.microsoft.com/web/downloads/platform.aspx 如果点击下载按钮后出现如下提示: 那么要更改一下 Internet 选项: 下载并运行后,在右上角搜索 “deploy” ,得到如下结果: 添加”未捆绑SQL支持的Web Deploy 3.5”,然后开始安装,安装成功后关闭 We...

更多

读写配置文件App.Config的注意事项

近期一个WPF需要读写简单的配置文件的功能,研究之后决定使用App.Config,这里记录一下使用要点: 项目中直接应该就有App.Config文件,没有的话自行创建。 打开后添加自己所需的配置项节点: <?xml version=”1.0″ encoding=”utf-8″ ?> <configuration> <startup> <supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.5.1″ /> </startup> <appSettings> <add key=”Url” value=””/> <add key=”Username” value=””/> <add key=”GroupId” value=””/> <add key=”LastPath” value=””/> </appSettings> </configuration> 读写代码示例: privat...

更多

使用JSON.NET反序列化抽象类或接口成员的方法

反序列化带有抽象或接口成员的类型时会遇到如下错误提示: Newtonsoft.Json.JsonSerializationException: Could not create an instance of type ITestInterface. Type is an interface or abstract class and cannot be instantiated. 问题和解决办法可以参考:http://stackoverflow.com/questions/15880574/json-net-how-to-deserialize-collection-of-interface-instances 这里总结一下,主要就是自己实现一个继承自SerializationBinder的类,来自己控制命名空间和程序集名称。 例如我们有一个文章类Article,里面有个成员是List<Paragraph>类型来表示段落列表,Paragraph是一个抽象类,其下面有若干个子类,表示诸如文本段落、列表段落、Markdown文本段落、引用段落等等,上述这些类都隶属于一个相同的程...

更多

ABP结合MongoDB的使用范例

ASP.NET Boilerplate官方的范例都是基于Entity Framework和NHibernate的,说是支持MangoDB,源码中也确实有MangoDB,但用Google寻遍世界也没找到任何说明或范例,无奈只有自己摸索了。 由于是刚刚接触ABP,测试时举步维艰,总算是得以达成,以下总结记录下这得来不易的成果: 首先前往官网去下载模板: http://www.aspnetboilerplate.com/Templates 选项如下: 下载好之后解压缩,用VS打开。 这时管理解决方案的NuGet包: 执行还原命令: 慢慢等待其自动下载和安装。 下好之后关闭NuGet窗口,执行重新生成解决方案操作,全部编译成功即可。 然后去其github空间: https://github.com/aspnetboilerplate 使用Git下载 aspnetboilerplate 项目的源码到本地,其地址为:https://github.com/aspnetboilerplate/aspnetboilerplate.git 下载好源码之后,添加现有项目: 选取这个 Abp.MongoDB ...

更多

正则表达式匹配“特定字符或开头或结尾”的方法

这个需求在标签搜索中常要用到,假设数据库中有类似以下标签字段字符串: 红色,樱桃红色,红色,玫红色,红宝石,红色尖晶石,玫红色石榴石,红色 这里我们要找完全匹配于“红色”的标签,为了方便测试准确性,我们使“红色”出现在了最前面、中间、最后面。 “红色”两个字前面可能是“,”或字符串开头,后面可能是“,”或字符串结尾,起先我想到的就是方括号匹配“[,^]”和”[,$]”,然而这根本不管用(C#、Mongodb和Javascript中都无效),原因不明,后来琢磨了半天,只能采用这样的形式才能匹配成功:”(^|,)”和”(,|$)” 最终的表达式为:(^|,)s*红色s*(,|$) 我们来检验一下: 替换后的结果: 分享或转载本博客站点内的所有原创内容时,都必须遵循此协议: 姓名标示-非商业性-相同方式分享 4.0 国际 (CC BY-NC-SA 4.0) 同时必须附加指向本文页面或本博客首页的超链接。 除此之外的转载、分享方式都必须征得本博客作者的授权,否则将会诉诸法律。

更多

解决MVC项目在IIS中不显示FontAwesome等字体图标的问题

本地测试无误,发布到服务器后字体图标就全不能显示了,IE里显示空,Chrome里显示长方形: 网站里MIME类型列表里是有.woff类型的: 不过不是“application/x-font-woff”,尝试在Web.config文件里覆盖之: <system.webServer> <staticContent> <remove fileExtension=”.woff” /> <!– In case IIS already has this mime type –> <mimeMap fileExtension=”.woff” mimeType=”application/x-font-woff” /> </staticContent> </system.webServer> 结果是无效的。 后来看到老外说貌似是MVC的BundleConfig问题: 尝试放弃使用Bundle方式引用FontAwesome的CSS,转而采用传统方式载入CSS: @*@Styles.Render(“~/Content/f...

更多