求助…想用C# winform 访问webapi开发一个web应用防火墙…怎么拦截

用C#开发网络防火墙技术分析
编辑:www.fx114.net
本篇文章主要介绍了"用C#开发网络防火墙技术分析",主要涉及到用C#开发网络防火墙技术分析方面的内容,对于用C#开发网络防火墙技术分析感兴趣的同学可以参考一下。
导读:   N-Byte网络守望者是一款单机版网络安全工具,简言之,就是一个用.NET开发的个人版防火墙。在N-Byte网络守望者1.0版的开发中,使用了NDIS Hook Driver技术来实现网络封包过滤功能,这使N-Byte网络守望者能够在网络层过滤网络封包,从而实现强大的功能。   由于软件的主程序是用C#写的,C#中没有提供具有类似DeviceIoControl函数功能的驱动设备控制函数,而NDIS Hook Driver技术下的驱动程序是用DDK下的C语言写的,为了能够实现主程序对驱动程序的控制和相互通信,采用了以下设计方案:   在以上方案中,需要一个负责主程序与NDIS Hook Driver驱动程序通信与控制的模块DriverDll.dll,并用C#编写的一个封装驱动程序中封包信息的模块,可以发送这个驱动程序信息到主程序,主程序可识别并操作模块中的数据类型。   在.NET应用程序使用驱动程序的问题上,面临着两个问题:   1.怎样实现.NET应用程序控制驱动程序的功能?   2.怎样从驱动程序向.NET应用程序传递非托管的数据类型?   以下是我们就这些问题的详细解决方法:   怎样实现.NET应用程序控制驱动程序的功能?   使用托管C++编写的DriverDll.dll来实现对驱动程序的直接控制,而主程序通过调用其中的方法来实现对驱动程序的间接控制。比如在NByte.h文件中定义了START_IP_HOOK常数用来作为传给驱动程序用来开启驱动程序封包过滤功能的参数,下面在托管C++模块中定义了IoCtrl托管类并定义了下面的向缓冲区写入参数的方法:   //向缓冲区写入数据。   DWORD WriteIo(DWORD code,PVOID buffer,DWORD count)   {if(hDriverHandle == NULL)   return ERROR_DRIVER_HANDLE;   DWORD bytesR   BOOL returnCode = DeviceIoControl(hDriverHandle,   code,   buffer,   count,   NULL,   0,   &bytesReturned,   NULL);   if(!returnCode)   return ERROR_IO_CTRL;   return SUCCESS;}   当然直接使用这个方法不太方便,所以定义一个公有函数,用来提供给主程序调用:   //开始进行封包过滤   bool StartIpHook()   { return (WriteIo(START_IP_HOOK, NULL, 0)==SUCCESS);   }   这样,只要在主程序中声明IoCtrl的对象ic,就可以通过ic.StartIpHook()就可以实现对驱动程序过滤功能的开启,用同样的方法也可以实现对驱动程序进行其它操作,比如添加、修改封包过滤规则等。   怎样从驱动程序向.NET应用程序传递非托管的数据类型?   为了能够输出安全日志,必须让主程序获得驱动程序中的封包信息。使用信号量机制可以很方便的实现驱动程序和非托管代码间的信息传递,那么对托管代码呢?这需要向.NET应用程序传递非托管的数据类型ACCESS_INFO。在NByte.h中,是这样定义这个ACCESS_INFO结构的:   typedef struct _ACCESS_INFO   {USHORT   ULONG sourceIp;   ULONG destinationIp;   USHORT sourceP   USHORT destinationP   }ACCESS_INFO;   显然,直接传递非托管数据类型是不可以的,需要转换一下。首先,在IoCtrl类中定义了几个要传递的封包信息参数:   public __gc class IoCtrl   { public:   USHORT //网际协议类型   ULONG sourceIp; //源IP地址   ULONG destinationIp; //目的IP地址   USHORT sourceP //源端口   USHORT destinationP //目的端口   &&&&&&   }   然后,在GetAccessInfo()函数中来给这些参数赋值:   void GetAccessInfo()   {   ACCESS_INFO   bool result=(ReadIo(GET_INFO,&ai,sizeof(ai))==SUCCESS);   this-&protocol=ai.   this-&sourceIp=ai.sourceIp;   this-&destinationIp=ai.destinationIp;   this-&sourcePort=ai.sourceP   this-&destinationPort=ai.destinationP   }   既然在IoCtrl类中获得了这些信息,但是需要把它们封装成主程序容易处理的数据类型,这样,用C#实现了InfoEvent类用来封装这些信息:   //本类封装了数据包的详细信息,可以通过事件实现对它的模块间传递。   public class InfoEvent:EventArgs   {   string sI //用来存放输出信息的私有成员   public int pL //CommonFunction.sPort数组的长度   pu //网络通信协议类型   public uint sourceIp; //数据包的源IP   public uint destinationIp; //数据包的目的IP   public ushort sourceP //数据包的源端口   public ushort destinationP //数据包的目的端口   &&&&&&&&&&&&   }   下面在用托管C++实现的InfoProvider驱动程序信息提供者类中把个InfoEvent类的对象传递给主程序,需要使用一个委托生成一个事件:   //声明委托事件,用来向主程序传递数据。   __delegate void DriverInfo(Object* sender, InfoEvent* e);   //声明响应事件函数。   __event DriverInfo* OnDriverI   然后在InfoProvider驱动程序信息提供者类中定义一个方法,在主程序中以线程的方式运行这个方法,在这个方法中使用了事件函数OnDriverInfo:   //用来获得驱动程序信息的进程,在主程序中将开启该进程。   void GetInfoThreadProc()   {   this-&hEvent=OpenEvent(SYNCHRONIZE,FALSE,&NBEvent&);   if(!ic-&GetDriverHandle())   {   }   while(true)   {f(!hEvent)   ExitThread(0);   WaitForSingleObject(this-&hEvent,INFINITE);   nPackets++;   ic-&GetAccessInfo();   ic-&ResetEvent();   //定义一个主程序可以识别的对象,通过OnDriverInfo传给主程序。   InfoEvent*ie=new InfoEvent(ic-&protocol,ic-&sourceIp,ic-&destinationIp,ic-&sourcePort,ic-&destinationPort);   OnDriverInfo(this,ie);   } ic-&CloseDriverHandle();   }   在主程序中,会开启这个进程并定义了OnDriverInfo的处理函数DealWithInfo:   pInfo=new InfoProvider();   //开启与驱动交换信息的进程   FilterThread=new Thread(new ThreadStart(pInfo.GetInfoThreadProc));   FilterThread.IsBackground=   FilterThread.Start();   pInfo.OnDriverInfo+=new InfoProvider.DriverInfo(DealWithInfo);   这样主程序就可以在DealWithInfo函数中加入对InfoEvent对象的处理了。可见,通过中间模块IoCtrl的转换,便实现了.NET主程序对驱动程序中非托管数据类型的获取和处理。 本文转自
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
你以为我会眼睁睁地看着你去送死?No,我会闭上眼睛的。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(815)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081',
blogTitle:'如何创建、发布Web Service和 C#WINFORM里如何调用WEB Service API',
blogAbstract:'一、创建和发布Web Service&&&&&&& Web服务方法中可以返回一个DataSet对象&&&&&&& WEB服务可以说是下一代WEB应用程序的基础,无论客户端是WINDOWS应用、ASP.NET Web Form程序、甚至其他语言的客户端,都可以与同一个WEB服务通信,其平台和语言无关性使其有了广阔的发展空间。
利用VS2005和IIS我们可以很容易地发布一个WEB SERVICE,因为其中有几个细节需要注意,所在初学者常常在这里出现问题,现通过一个简单的例子说明如何创建和发布一个WEB SERVICE。
环境:Windows Server 2003,.Net& FrameWork 2.0,IIS6.0',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'你以为我会眼睁睁地看着你去送死?No,我会闭上眼睛的。',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}C# 中WinForm 应用程序实现远程文件管理(上传、下载)的种种问题
&& WinForm可以通过C#语言提供的WebClient类的UploadFile和DownLoadFile函数实现文件的上传和下载功能,但是这也让我尝试到了使用这个函数时的辛酸,搞了整整一天才成功。而且在使用的环境是win7 + iis7.0,iis7.0和iis6.0相比在,在配置操作上有很大的区别。
1 文件下载,文件下载功能很easy,一个函数,也没有出现任何问题,估计最大的问题就是服务器文件路径找不到,产生的404错误,未找到。
WebClient myClient = new WebClient();
String localfilePath = dialog1.FileN
myClient. DownloadFile (&http://localhost:2368/upload/fileName&, localfilePath);
2 文件上传功能:
这个功能整整的折磨了我一天,知道晚上9点中才基本搞定。也把种种问题遇到了。
&&WebClient client = new WebClient ();
&// Add a user agent header in case the &requested URI contains a query.
client.Headers.Add ("user-agent", "Mozilla/4.0 ( MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
client.UploadFile(localfile,&PUT&,ServerPath);
2.1 远程服务器返回错误: (401)&&添加身份验证:
需要在站点开启身份验证的权限(允许匿名访问,windows 身份验证),在iis7.0内容视图上双击身份验证、开启匿名身份验证和windows身份验证。
2.2 远程服务器返回错误 (403) 已禁止
解决方法:iis虚拟目录的写入权限和uploadfile文件夹给iis_user用户开写入权限。
进入网站的虚拟路径目录,虚拟目录属性给写入权限;
2.3 远程服务器返回错误: (404) 未找到
分析与解决方法:一般是由于UploadFile()函数中中&PUT&、&POST&关键字,要选择使用&PUT&关键字。同时要添加iis的处理程序映射。
WebClient myClient = new WebClient();
myClient.UploadFile(Serverurl,"PUT",localfilePath);
//UploadFile函数中如果关键字POST,必须改用PUT。同时要配置IIS的功能视图中的处理程序映射,配置过程如下:开始-运行&inetmgr命令,开启ii7,左侧选择虚拟目录,右侧选择功能视图&处理程序映射-双击进入,选择ExtensionlessUrlHandler-Integrated-4.0双击后,点击请求限制-谓词面板-,下列谓词之一:GET,HEAD,POST,DEBUG,PUT,DELETE。默认没有PUT,DELETE,添加上。
2.4&远程服务器返回错误: (405) 不允许的方法
解决方法:把网站发布到iis上,设置iis的写入权限和上传文件夹的写入权限。不知道为什么在本地调试都是报这种错误,把网站发布到iis上,再通过iis访问就可以通过了,邪乎~。
2.5&远程服务器返回错误: (500) 内部服务器错误
分析与解决方法:可能是client信息头需要设置,
&&WebClient client = new WebClient ();
&// Add a user agent header in case the requested URI contains a query.
&&client.Headers.Add ("user-agent", "Mozilla/4.0 ( MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
2.6远程服务器返回错误: (501) 未实现
webdav没有启动,ii6中webdav作为iis的辅助服务,默认不开启,可以自己开启。
或win7中WebClient服务没有开启(我的电脑-管理-服务中开启此服务),同时在iis7.0 中配置webdav服务,添加授权规则:allow access to ( all content); Allow access to this content to (All users) ;permission (Read, Source,Write)
遇到的问题基本就这些,具体为什么会出现这种错误,再次不介绍,可以去网上搜搜。
阅读(...) 评论()2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务
WebService的特性有以下几点:
1.使用XML(标准通用标记语言)来作为数据交互的格式。
2.跨平台性,因为使用XML所以只要本地应用可以连接网络解析XML就可以实现数据交换,比如安卓、IOS、WindowsPhone等都可以实现对Web service的数据交互。
3.基于HTTP协议,直接跨越防火墙,通用型强;
下面使用Visual Studio 2013(其他VS版本亦是如此)来创建一个简单Web service服务。
一、打开Visual Studio-&文件-&新建-&网站
二、之后选择ASP.NET空网站,再点击&确定&
三、新建网站后你会看到解决方案管理器中看到一个web.config,待会我们可以通过配置这个文件来实现浏览器对WebService的远程调用。现在,右键解决方案中的项目名添加一个WebService项目。
四、之后,你可以在项目模版中找到Web服务(ASMX),添加它!
五、创建之后在APP_Code文件夹中创建一个WebService.cs文件
在网站根目录下会同时创建一个WebService.asmx文件
这两个文件中WebService.cs负责逻辑部分,WebService.asmx提供服务部分。将来引用WebService服务时将直接引用WebService.asmx文件来调用WebService服务,服务的执行部分就是WebService.cs文件
现在打开WebService.cs文件来编辑逻辑部分实行一个简单的《客户端调用web服务实现一个简单的加法运算,并返回以字符串给客户端运算结果》
Web.Services.cs文件
5 using System.Collections.G
6 using System.L
7 using System.W
8 using System.Web.S
10 /// &summary&
11 /// WebService 的摘要说明
12 /// &/summary&
13 [WebService(Namespace = "http://tempuri.org/")]
14 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
15 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
16 // [System.Web.Script.Services.ScriptService]
17 public class WebService : System.Web.Services.WebService {
public WebService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
/// &summary&
/// 方法上头的[WebMethod]是声明一个web服务方法,如果你想写个方法能让客户端调用并返回结果就必须在方法上头标注[WebMethod]
/// 如果是只负责逻辑运算或私有方法,并不打算给客户端结果,只给类方法内部调用就无需声明[WebMethod]
/// &/summary&
/// &param name="a"&&/param&
/// &param name="b"&&/param&
/// &returns&将运算结果转换成字符串返回&/returns&
[WebMethod]
public string HelloWorld(int a, int b) {
int result = a +
return result.ToString();
&上面的代码写了一个基本的方法供远程调用,将cs文件保存后,一个简单的web服务就创建了!
下面我们启动这个项目,用浏览器查看微软为我们定义测试的调用页面:
在这里我们可以看到我们写的Hello方法可以调用了,我们单击进入这个方法进入调用调试页面:
输入参数,我们写的是一个简单的加法运算,参数便是我们写的HelloWorld方法的参数a和b,我们输入两个整数点击调用,出现如下结果:
下面是web服务返回的结果,其中133就是HelloWorld参数a+b返回的结果:
1 &?xml version="1.0" encoding="UTF-8"?&
2 &string xmlns="http://tempuri.org/"&133&/string&
&到这里,以后我们想要调用一个web服务就可以通过以上方式把客户端从服务器获取数据,访问:"主机名/web服务名.asmx"就可以调用了。
得到的数据是个XML,所以客户端得到数据后需要客户端解析XML文件。
注意:以上创建在浏览器调用的web服务仅供本地计算机调试使用,需要配置web.config(之前提到过)才能实现远程调用调试
如果不配置,在远程调用会出现:测试窗体只能用于来自本地计算机的请求解决 的问题。
如需远程调用可以参考一下方法:
在网站的解决方案的下方找到web.config
打开后添加如下配置即可:
1 &system.web&
&webServices&
&protocols&
&add name="HttpGet"/&
&add name="HttpPost"/&
&/protocols&
&/webServices&
8 &system.web&
&配置之后,就可以在远程通过浏览器来调用webservice.asmx服务了,开发测试之后,为了安全,一定把该配置去掉!
下一篇文章将介绍如何用WinForm引用web服务并取得返回值!
阅读(...) 评论()

我要回帖

更多关于 winform webservice 的文章

 

随机推荐