分类: 软件|.NET技术预览模式: 普通 | 列表

ASP.NET中impersonate验证失败案例分析

首先,介绍一下,ASP.NET中与impersonate相关的背景知识:

ASP.NET中的impersonate跟Internet Information Services (IIS)中的Integrated Windows authentication (NTLM)的功能是类似的,它可以通过内部网络中的domain用户登录信息来确定用户是否具有Windows identity,从而可以确定一个Web应用程序是否可以访问微软Windows平台上的资源,例如一些通过使用Access Control List (ACL)而受到保护的文件,或者某台数据库服务器.

默认情况下,ASP.NET是被设置为Windows authentication模式,这样就可以将Windows identity应用到当前的HttpContext对象中去(注意,当使用anonymous identification 匿名验证时,HttpContext对象中用户名Name是空白的).但是,这不是用于某一个页面,而是为一个Web应用程序提供访问权限,从而可以访问某一个文件或是网络资源.

要使用ASP.NET的impersonate,我们可以在Web.config 文件中配置impersonate属性,例如下面所示:

<configuration>
  <system.web>
    <identity impersonate="true" userName="***" password="***" />
  </system.web>
</configuration>

查看更多...

Tags: ASP.NET impersonate

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1

ASP.NET中为WebService实现身份验证功能

        在ASP.NET中,通常情况下,WebService是默认没有权限控制的,只要有程序能发现它就能任意使用它.如果没有权限控制,被他人随意调用了更新或删除等操作的WebService,那将是极其危险的.要想为WebService加权限控制功能,即身份验证功能,我们可以使用SOAP方式传递保存在Http Header头里的身份信息给WebService,即使用了Attribute对象SoapHeader.下面通过一个简单实例来讲解它的实现方法:

1.服务器端.

 

查看更多...

Tags: WebService SOAPHeader 身份验证

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 24

用edtFTPnet实现的FTP文件Monitor监测功能

最近公司内部提出了一个数据文件monitor监测功能的需求,要实现自动定时的FTP数据文件monitor。

.NET frame 2.0+里就一个ftpwebrequest类能实现FTP登录后请求FTP 文件,跟请求网页一样方便而简单,但是有一个很大缺点,就是:它没有logout(登出)的功能,有网友说用它的Abort()方法可以实现logout,但实际它只是终止当前请求操作在执行异步操作时才能使用。如果这个类的原理跟webrequest类似,那么它就请求一次就会登录一次,然后登出一次,假如有大量的文件要请求,那么性能是很低的,而且对FTP的伤害是致命的。

最终我们考虑还是需要用到Socket技术来实现FTP的login,logout,list等功能。在这里要解释一下什么是Socket。所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

正好刚好有现成的开源框架--edtFTPnet,它是enterprisedt公司提供的一个免费框架。

查看更多...

Tags: edtFTPnet FTP Socket Monitor

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 17

用C#实现的简单树型图生成算法!

这是三年前在为公司的data collect system写的一个简单树型图生成算法,现在觉得挺有意思的,现在翻出来晒晒一下.

其实树型图是显示在DataGrid或GridView里的,如下图:
BlanceSheet  1224
├Total Assets  5465433

查看更多...

Tags: 树型图 算法

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 65

探索Asp.net的Postback机制

__doPostBack作为在asp.net中一个很核心很重要的部分,我们有必要深入了解一下.

其实,__doPostBack是一个很简单的脚本函数.代码如下:

 

//__doPostBack
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value
= eventTarget;
theForm.__EVENTARGUMENT.value
= eventArgument;
theForm.submit();
}
}

 

查看更多...

Tags: ASP.NET Postback

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 135

控件排序事件中用DataView及DataTable排序

在做ASP.NET页面开发时,经常要用到dataset(或者DataTable),绑定到DataGrid或GridView上要进行重新排序,排序规则按照数组fids元素的顺序进行。本文将介绍如何在排序事件用DataView及DataTable实现排序功能.

一般人的做法是用DataView排序,关键代码如下

DataView dv = dt.DefaultView;

dv.Sort = "dis,发布日期 desc";

然后把dv绑定到DataGird输出。

不过问题又来了,如果我们需要分页功能,在翻页时,我们需要ViewState等控件来保存状态啊.那么我们还是需要用到DataTable或DataSet, DataView本身不能被序列化,DataView中的Table属性是未经排序的,所以它在这里不起作用.

于是有个菜鸟级土解决方法如下(只使用了简单的循环):

private DataTable SortTable(DataTable dt,string[] pids)

         {

              DataTable dt0 = dt.Clone(); //复制原表结构

              for(int i=0;i<pids.Length;i++)

              {

                   if(pids[i] != string.Empty)

                   {

                       DataRow[] drs = dt.Select("pos_id=" + pids[i]);

                       if(drs.Length > 0)

                       {

                            foreach(DataRow dr in drs)

                            {

                                 dt0.ImportRow(dr); //导入行

                            }

                       }

                   }

              }

              return dt0;

     }

说明:就是对排序的数组循环,在datatable中找对应的行,然后复制到新表中。

该方法的效率还是可以的,不过如果交集次数大于20,000,000的时候,就会有效率问题.

其实啊,新近版的.NET类库里的DataRow[]集合对象中已经有个CopyToDataTable方法可以解决DataTable排序问题,在控件的排序事件中实现如下代码:

string currentSortColumn = this.SortColumn;//封闭ViewState变量的属性
      this.SortColumn = e.SortExpression;

 if (currentSortColumn == this.SortColumn)
                this.SortAscending = !this.SortAscending;//封闭ViewState变量的属性

       else
                this.SortAscending = false;

DataTable dt = (DataTable)ViewState["DataSource"];
      DataRow[] filter = dt.Select("",this.SortColumn + " " + (this.SortAscending? "ASC" : "DESC"));
      DataTable newTable = filter.CopyToDataTable();
      ViewState["DataSource"] = newTable;
      this.BindDateGrid();

但我们却不知道CopyToDataTable的效率是否足够好.

Tags: ASP.NET 排序 DataView DataTable ViewState

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 236

ViewState基本原理完全解析

ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。     
    
  ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。    
   
  当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的,对用户来说是透明的。     
    
    
  使用ViewState的条件    
  如果要使用   ViewState,则在   ASPX   页面中必须有一个服务器端窗体标记   (<form   runat=server>)。窗体字段是必需的,这样包含   ViewState   信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET   页面框架才能添加隐藏的字段。    
  Page   的   EnableViewState   属性值为   true。    
  控件的   EnableViewState   属性值为   true。    
   
  页面本身将   20   字节左右的信息保存在   ViewState   中,用于在回传时将   PostBack   数据和   ViewState   值分发给正确的控件。因此,即使该页面或应用程序禁用了   ViewState,仍可以在   ViewState   中看到少量的剩余字节。    
   
  设置ViewState    
   
  ViewState可以在控件,页,程序,全局配置中设置。缺省情况下   EnableViewState   为   true   。如果要禁止所有页面   ViewState   功能,可以在程序配置中把   EnableViewState   设为   false   。    
   
   
  在控件中:    
   
  <asp:DataGridEnableViewState="false"%>    
  或    
   
  DataGrid1.EnableViewState=   false;    
  在页中:    
   
  <%@   PageEnableViewState="false"   %>    
  或    
   
  Page.EnableViewState=   false;    
  在程序中:    
   
  在web.config中加入    
   
  <pages   enableViewState="false"   />    
  在全局配置:    
   
  在machine.config中修改    
   
  <pages   enableViewState="false"   />    
   
  EnableViewState优先级别:    
  全局配置   <   程序 <   页<   控件    
   
  注意:下列服务器控件不能禁止ViewState    
   
  Textbox    
  Checkbox    
  Checkbox   List    
  RadioButtonList    
  上面控件的状态通过IPostBackEventHandler   和   IPostBackDataHandler接口处理,而不是ViewState的机制,所以EnableViewState没有效果。    
   
  ViewState对象    
   
  在页面回传间通信,ASP中一般利用窗体的属性和   session   来存放数据,在   ASP.NET   中也可以使用   ViewState   对象来做同样的处理。    
   
   
     
   
  在ViewState存放数据:    
   
  ViewState[key]=   value;    
  或    
   
  ViewState.Add(key,value);    
  取出数据:    
   
  TempStr   =ViewState[key];    
  key不存在时返回空。    
   
  不能通过ViewState对象来访问控件的值。    
   
  动态建立控件的ViewState:    
   
  当需要动态地建立一个服务器控件,如下建立了一个   RadioButton   控件并加入到窗体控件集合中:    
   
  RadioButton   rb   =   new   RadioButton();    
  Page.Controls[1].Controls.Add(pc);    
  上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。    
   
  RadioButton   rb   =   new   RadioButton();    
  Page.Controls[1].Controls.AddAt(1,pc);    
   
  通常,这些动态生成的控件的状态也需要生成到   ViewState   中去,但这个功能并没有完全实现,特别是生成的控件插入到已有的控件中时。    
   
   
  当动态生成控件和已有控件并存时   ViewState   的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在   Page_Init   和   Page_Load   事件中读取   ViewState。当页面的控件读取   ViewState   的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被    
  生成时,页面就会省略掉ViewState或者以剩下或许错误的   ViewState   来填充控件。    
   
  所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的   ViewState   通过EnableViewState禁止掉。     
    
 
提醒:    
  1.   当存在页面回传时,不需要维持控件的值就要把   ViewState   禁止。    
  2.   ViewState的索引是大小写敏感的。    
  3.   ViewState不是跨页面的。    
  4.   为了能包存在   ViewState   中,对象必须是可流化或者定义了   TypeConverter。    
  5.   控件   TextBox   的   TextMode   属性设置为   Password时,它的状态将不会被保存在   ViewState   中,这应该是出于安全性的考虑。    
  6.   在页面没有回传 或 重定向 或 在回传中转到(transfer)其他页面时不要使用   ViewState。    
  7.   在动态建立控件时要小心它的   ViewState。    
  8.   当禁止一个程序的   ViewState   时,这个程序的所有页面的   ViewState   也被禁止了。    
  9.   只有当页面回传自身时ViewState   才是持续的。

Tags: ASP.NET ViewState 原理

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 172

Ajax如何在触发AsynPostBack后调用JQuery

虽然微软已经宣布将JQuery并入asp.net中,但是在asp.net Ajax中调用JQuery,仍然需要我们自己写一些后代码或脚本。

例如我们用asp.net Ajax异步更新了UpdatePanel之后,需要立即调用JQuery所写的脚本来做一些处理(如改变样式,产生动画效果等等)。

有以下两方法可以实现这样的功能:

 

查看更多...

Tags: ASP.NET AJAX JQuery AsynPostBack Up&#100;atePanel

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 36

成功解决ASP.NET AJAX异步刷新失效难题

本人接触ASP.NET AJAX比较晚,以前主要做的都是html+javascript原始底层的开发,高级一点就用过Ajax.Pro组件,直到微软release了ASP.NET 3.5,觉得它自带的ASP.NET AJAX非常强大,于是看了ASP.NET AJAX in action自学了一下.

在做实例实践时都是用visual studio developement server执行asp.net,但没有想到的是换成IIS,ajax的异步刷新效果就没有了!

发现visual studio developement server和IIS上生成的html相比多了一下面的javascript片段:

<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tUpdatePanel1'], ['Button1'], [], 90);
//]]>
</script>


   
这段代码本来应该是<Asp:ScriptManager>这个控件来生成的,但是部署到服务器上之后并没有生成这段代码。

查看更多...

Tags: ASP.NET AJAX 异步刷新 失效 Ajax Extensions

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 248

用生产者消费者线程在Queue<T>中实现同步

使用C#进行多线程编程经常会用队列池进行线程同步的方法,实现就用到Queue。Queue是线程安全的(Thread safe),但不是泛型的,对象出列时需要进行拆箱转换。也有人会马上想到Queue<T>,但可惜的是泛型Queue<T>却不是线程安全,我们需要用其它编程方法来实现它。

下面介绍一种方法,它能够使用泛型Queue<T>进行线程同步,但是需要用到 lock 关键字以及 AutoResetEvent ManualResetEvent 类对主线程和两个辅助线程进行线程同步。


该示例创建两个辅助线程。一个线程生成元素并将它们存储在非线程安全的泛型队列中。另一个线程使用此队列中的项。另外,主线程定期显示队列的内容,以便该队列可由三个线程进行访问。lock 关键字用于同步对队列的访问,以确保队列的状态不会被破坏。

查看更多...

Tags: 多线程 Queue 同步 AutoResetEvent ManualResetEvent

分类:软件|.NET技术 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 301