﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-NetFans .NET Blog</title><link>http://www.cnblogs.com/NetFans/</link><description>复杂的事情要简单做。简单的事情要认真做。 认真的事情要重复做。重复的事情要创造性地做。</description><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 08:30:27 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 08:30:27 GMT</pubDate><ttl>60</ttl><item><title>★★★[开源]多功能文本框控件源码[下载]★★★</title><link>http://www.cnblogs.com/NetFans/archive/2007/01/18/624196.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Thu, 18 Jan 2007 14:05:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2007/01/18/624196.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/624196.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2007/01/18/624196.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/624196.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/624196.html</trackback:ping><description><![CDATA[摘要: ★★★[开源]多功能文本框控件源码[下载]★★★<br>          前几天看到雪山之巅的推出一个梅花日历，感觉挺不错的。利用晚上整合了一其它验证和文本录入效果，现在把它共享一下，主要功能如下：<br>          1、文本框得/失去焦点用户录入的自定义效果加强。<br>          2、日期的选择。<br>          3、控制用户可录入整数、浮点数(自定义小数位数)、大写字母、小写字母、中文、电话号码、IP地址等。<br>          4、响应回车焦点下移。&nbsp;&nbsp;<a href='http://www.cnblogs.com/NetFans/archive/2007/01/18/624196.html'>阅读全文</a><img src ="http://www.cnblogs.com/NetFans/aggbug/624196.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>MagicAjax.net2.0 框架特殊字符的处理</title><link>http://www.cnblogs.com/NetFans/archive/2007/01/14/620161.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Sun, 14 Jan 2007 09:21:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2007/01/14/620161.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/620161.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2007/01/14/620161.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/620161.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/620161.html</trackback:ping><description><![CDATA[<DIV style="BORDER-RIGHT: #7ebf4f 1px solid; BORDER-TOP: #7ebf4f 1px solid; FONT-SIZE: 11px; BORDER-LEFT: #7ebf4f 1px solid; BORDER-BOTTOM: #7ebf4f 1px solid; HEIGHT: 350px" align=left>&nbsp; &nbsp; &nbsp; &nbsp; 发现这么多人在用这个MagicAjax框架，但是没有人发现这个框架对特殊字符html标记未处理。回调后对页面中特殊字符显示问题，比如特别符号 <I>&amp;#</I>?; （其中 ? 代表 ISO 8859-1 的编码） &lt; &lt; &gt; &gt; &amp; &amp; " "&nbsp; 等,当一本框值为<SPAN style="COLOR: red">&lt;100公的的猪</SPAN>，其中有一小于号 (&amp;lt;)，而&amp;符号又被译出(&amp; amp),最后文本框的值将会变成&amp; amp lt,这样几个字符。有如下两种解决办法：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: #006633">解决办法一</SPAN>：在页面中显示数据时所有的特殊符号替换为全角,不过这个方法太笨了，也太麻烦了。建议使用第二种方法。<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;例如：<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string str = "所有&lt;100公所的猪"; <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; str.Replace('&lt;', '＜');//替换为全角，不过，还有&lt; &lt; &gt; &gt; &amp; 这些符号哦，一个个替换就是了,<BR>&nbsp; &nbsp; &nbsp; &nbsp;<SPAN style="COLOR: #006633"> &nbsp;解决办法二：<SPAN style="COLOR: #000000">更改MagicAjax源代码，不用怕，^-^,&nbsp; 这个更改并不难，首先到官方网站下载。net2.0的源代码下来，打开项目,找到一个为 &nbsp; AjaxCallHelper.cs &nbsp; &nbsp; 的类，这类的功能还真是强啊。在里面找到方法为EncodeString(string str),源代码如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;EncodeString(</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;str)<BR><IMG id=Codehighlighter1_48_473_Open_Image onclick="this.style.display='none'; Codehighlighter1_48_473_Open_Text.style.display='none'; Codehighlighter1_48_473_Closed_Image.style.display='inline'; Codehighlighter1_48_473_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_48_473_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_48_473_Closed_Text.style.display='none'; Codehighlighter1_48_473_Open_Image.style.display='inline'; Codehighlighter1_48_473_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_48_473_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_48_473_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">TODO:&nbsp;use&nbsp;1&nbsp;regular&nbsp;expression&nbsp;(faster)</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Text.StringBuilder&nbsp;sb&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Text.StringBuilder(str);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\\\</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\\</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\r</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\r</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&amp;lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Replace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&amp;amp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Insert(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">\"</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">\"</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;sb.ToString();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把这些特殊字符在显示的时候替换不OK了，最后Release项目，问题解决了。哦也！</SPAN><BR></SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; 让MagicAjax支持中文！问题解决并不难，网上已有很多解决的相关文章，这里就不多说了，不过在项目中这个方法其实也蛮好用的，<BR>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; AjaxCallHelper.WriteAlert("数据保存成功！")//当一按扭为ajaxpanel内时，注册javascript 的alert脚本是弹不出消息框的，用这个弹出来就行了，看懂这个框架机制的你就知道它为什么弹出不消息框了，hoho。<BR>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;AjaxCallHelper.Write("editGrid();")//调用指定的javascript方法记得加上分号哦。</DIV><img src ="http://www.cnblogs.com/NetFans/aggbug/620161.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48001/" target="_blank">上海电信计划2012年80%用户实现100M带宽</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>利用.net反射动态调用指定程序集的中的方法</title><link>http://www.cnblogs.com/NetFans/archive/2007/01/07/614364.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Sun, 07 Jan 2007 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2007/01/07/614364.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/614364.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2007/01/07/614364.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/614364.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/614364.html</trackback:ping><description><![CDATA[摘要:   每个.net程序集除了代码外都额外包含了元数据。元数据包括了程序集本身的信息，比如版本号，引用了什么程序集,所有类型的信息,包括其方法、属性、字段。使用.net反射，可以在运行时读取这些信息，并且可以动态地调用方法。  项目快完了，终于有时间来写blog了，,  做一个动态调用程序集指定方法的例子。  项目1(Demo)中包含一个Test类,Test类中写了一个getList方法，这个方法返回&nbsp;&nbsp;<a href='http://www.cnblogs.com/NetFans/archive/2007/01/07/614364.html'>阅读全文</a><img src ="http://www.cnblogs.com/NetFans/aggbug/614364.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>windows控件嵌入aspx页面</title><link>http://www.cnblogs.com/NetFans/archive/2006/09/09/499523.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Sat, 09 Sep 2006 03:03:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2006/09/09/499523.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/499523.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2006/09/09/499523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/499523.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/499523.html</trackback:ping><description><![CDATA[<font color=#1d58d1><a href="http://msdn.microsoft.com/msdnmag/issues/02/06/Rich/default.aspx">http://msdn.microsoft.com/msdnmag/issues/02/06/Rich/default.aspx</a><br>上符微软的的这个例子说明</font>
<img src ="http://www.cnblogs.com/NetFans/aggbug/499523.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>web services用soap头实现身份验证</title><link>http://www.cnblogs.com/NetFans/archive/2006/09/09/499516.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Sat, 09 Sep 2006 02:56:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2006/09/09/499516.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/499516.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2006/09/09/499516.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/499516.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/499516.html</trackback:ping><description><![CDATA[<div style="border: #7ebf4f 1px solid;width:350px; height:350px;" align="left"><SPAN style="FONT-SIZE: 10pt">在调用Web Serivices时,往往需要身份验证,使得通过验证的用户才能调用你Web Serivices中的方法.当然你可以通过将参数添加到每个需要自定义身份验证方案的Web services方法中去,这需要花费很大的精力.IssueVision 中使用了非常常用而且有效便捷的方法-----使用<STRONG>SoapHeader</STRONG>来实现自定义身份验证数据的传递.<BR>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>SoapHeader</STRONG>提供了一种方法，用于将数据传递到Web services方法或从Web services方法传递数据，条件是该数据不直接与Web services 方法的主功能相关. 你不用将参数添加到每个需要自定义身份验证方案的Web services 方法，而可以将引用从 <STRONG>SoapHeader</STRONG> 派生的类的 <FONT color=#0000ff>SoapHeaderAttribute</FONT> 应用于每个Web services 方法。从 <STRONG>SoapHeader</STRONG> 派生的类的实现处理该自定义身份验证方案. IssueVision 就是利用<STRONG>SoapHeader</STRONG>的这种能力来实现自定义身份验证数据传递的.</SPAN><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 我们来看一下如何利用<STRONG>SoapHeader</STRONG>来传递数据.<BR>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>1</STRONG>. 首先需要在服务中定义一个从 SOAPHeader 派生的类,表示传入 SOAP 标头的数据.<BR>&nbsp;&nbsp;&nbsp; IssueVision 在中IssueVisionWeb项目(此项目用于发布Web Services)中通过创建<STRONG>CredentialSoapHeader</STRONG>类来实现第一步.<BR><BR><FONT color=#333399>CredentialSoapHeader.cs</FONT><BR><BR>
<TABLE style="WIDTH: 508px; HEIGHT: 136px" cellSpacing=0 cellPadding=1 rules=all align=left border=1 frame=box>
<TBODY>
<TR>
<TD style="FONT-SIZE: 8pt" vAlign=center align=left bgColor=#d2d2d2>
<P style="FONT-SIZE: 8pt"><FONT size=2>using System.Web.Services.Protocols;</FONT></P>
<P style="FONT-SIZE: 8pt"><FONT size=2>namespace IssueVision.Web<BR>{<BR>&nbsp;public class <FONT style="BACKGROUND-COLOR: #ffffb6">CredentialSoapHeader : SoapHeader<BR></FONT>&nbsp;{<BR>&nbsp;&nbsp;private string m_username;<BR>&nbsp;&nbsp;private string m_password;</FONT></P>
<P style="FONT-SIZE: 8pt"><FONT size=2>&nbsp;&nbsp;public string Username<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;get{ return m_username;}</FONT></P>
<P style="FONT-SIZE: 8pt"><FONT size=2>&nbsp;&nbsp;&nbsp;set{ m_username = value;}<BR>&nbsp;&nbsp;}</FONT></P>
<P style="FONT-SIZE: 8pt"><FONT size=2>&nbsp;&nbsp;public string Password<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;get{ return m_password;}</FONT></P>
<P style="FONT-SIZE: 8pt"><FONT size=2>&nbsp;&nbsp;&nbsp;set{ m_password = value;}<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR></FONT></P></TD></TR></TBODY></TABLE></P>
<P style="FONT-SIZE: 8pt"><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>&nbsp;&nbsp; <STRONG>2</STRONG>. 将服务的公共字段声明为该类型,使该<STRONG>SoapHeader</STRONG>在Web Services的公共合同中公开,并在创建代理时可由客户端使用.<BR><BR>&nbsp;&nbsp;&nbsp; IssueVision的Web Services----IssueVisionServices.asmx如此实现.<BR><BR>IssueVisionServices.asmx代码片断:<BR><BR>public class IssueVisionServices : WebService<BR>&nbsp;{<BR>&nbsp;&nbsp;...<BR>&nbsp;&nbsp;private CredentialSoapHeader m_credentials;</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;// custom SOAP header to pass credentials<BR>&nbsp;&nbsp;public CredentialSoapHeader Credentials<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; get {&nbsp;return m_credentials; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; set { m_credentials = value; }<BR>&nbsp; }<BR>&nbsp; .......<BR>}<BR><BR>&nbsp;&nbsp;&nbsp; <STRONG>3</STRONG>. 在Web Services使用 SoapHeader 自定义属性定义一组关联的标头,服务中的每个 WebMethod 都可以使用.(默认情况下，标头是必需的，但也可以定义可选标头)<BR><BR>&nbsp;&nbsp;&nbsp; IssueVisionServices.asmx代码片断:<BR><BR>&nbsp; ....<BR>&nbsp;&nbsp;[WebMethod(Description="Returns the lookup tables for IssueVision.")]<BR>&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ffffb6">[SoapHeader("Credentials")]</FONT><BR>&nbsp;&nbsp;public IVDataSet GetLookupTables()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ffffb6">SecurityHelper.<STRONG>VerifyCredentials</STRONG>(this);</FONT>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return new IVData().GetLookupTables();<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp; SecurityHelper类的VerifyCredentials方法用来从Web Services中的SoapHeader类来得到自定义身份验证凭据(如用户名和密码).<BR><BR>&nbsp; SecurityHelper.cs代码片断如下:<BR><BR>// verifies the clients credentials<BR>&nbsp;&nbsp;public static void <FONT style="BACKGROUND-COLOR: #ffffb6">VerifyCredentials(IssueVisionServices <STRONG>service</STRONG>) <BR></FONT>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ccccff">&nbsp;if (service.Credentials == null || service.Credentials.Username == null || service.Credentials.Password == null )&nbsp;&nbsp; //如果没有认证信息,返回SoapException,这样就不能匿名调用Web Method了<BR></FONT>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;EventLogHelper.LogFailureAudit("A login was attempted with missing credential information.");<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw new SoapException(string.Empty, SoapException.ClientFaultCode, "Security");<BR>&nbsp;&nbsp;&nbsp;}</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;string password = <FONT style="BACKGROUND-COLOR: #ffffb6">Authenticate(<STRONG>service</STRONG>.Credentials)</FONT>;<BR>&nbsp;&nbsp;}</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;// authenticates a user's credentials passed in a custom SOAP header<BR>&nbsp;&nbsp;private static string Authenticate( <FONT style="BACKGROUND-COLOR: #ffffb6">CredentialSoapHeader <STRONG>header</STRONG></FONT>) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;DataSet dataSet = new DataSet();<BR>&nbsp;&nbsp;&nbsp;string dbPasswordHash;</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;try <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SqlConnection conn = new SqlConnection(Common.ConnectionString);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SqlCommand cmd = new SqlCommand("GetUser", conn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@UserName", <FONT style="BACKGROUND-COLOR: #ffffb6"><STRONG>header</STRONG>.Username</FONT>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;cmd.CommandType = CommandType.StoredProcedure;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SqlDataAdapter da = new SqlDataAdapter(cmd);<BR>&nbsp;&nbsp;&nbsp;&nbsp;da.Fill(dataSet);<BR>&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;catch (Exception ex) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;EventLogHelper.LogFailureAudit(string.Format("The GetUser stored procedure encounted a problem: {0}", ex.ToString()));<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw new SoapException(string.Empty, SoapException.ServerFaultCode, "Database");<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;// does the user exist?<BR>&nbsp;&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ffffb6">if (dataSet.Tables[0].Rows.Count == 0) <BR></FONT>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;EventLogHelper.LogFailureAudit(string.Format("The username {0} does not exist.", header.Username));<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw new SoapException(string.Empty, SoapException.ClientFaultCode, "Security");<BR>&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// we found the user, verify the password hash by compare the Salt + PasswordHash<BR>&nbsp;&nbsp;&nbsp;&nbsp;DataRow dataRow = dataSet.Tables[0].Rows[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;dbPasswordHash = (string)dataRow["PasswordHash"];<BR>&nbsp;&nbsp;&nbsp;&nbsp;string dbPasswordSalt = (string)dataRow["PasswordSalt"];</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;// create a hash based on the user's salt and the input password<BR>&nbsp;&nbsp;&nbsp;&nbsp;string passwordHash = HashString(dbPasswordSalt + header.Password);</P>
<P style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;// does the computed hash match the database hash?<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (string.Compare(dbPasswordHash, passwordHash) != 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventLogHelper.LogFailureAudit(string.Format("The password for the username {0} was incorrect.", header.Username));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new SoapException(string.Empty, SoapException.ClientFaultCode, "Security");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return dbPasswordHash;<BR>}<BR><BR>&nbsp; <STRONG>4</STRONG>. 最后客户端在调用要求标头的方法之前，需直接在代理类上设置标头.<BR><BR>&nbsp; IssueVision 的SmartClient端的WebServicesLayer类来调用此Web Services<BR><BR>&nbsp; WebServicesLayer.cs程序片断如下:<BR><BR>private static IssueVisionServices GetWebServiceReference(<FONT style="BACKGROUND-COLOR: #ffffb6">string username, string password</FONT>)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;IssueVisionServices dataService = new IssueVisionServices();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//&lt;ReplaceWithWse&gt;<BR>&nbsp;&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ffffb6"><STRONG>CredentialSoapHeader </STRONG>header = new CredentialSoapHeader();<BR>&nbsp;&nbsp;&nbsp;header.Username = username;<BR>&nbsp;&nbsp;&nbsp;header.Password = password;<BR></FONT>&nbsp;&nbsp;&nbsp;dataService.CredentialSoapHeaderValue = header;<BR>&nbsp;&nbsp;&nbsp;//&lt;/ReplaceWithWse&gt;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;InitWebServiceProxy(dataService);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return dataService;<BR>}<BR><BR>&nbsp;&nbsp; 通过以上步骤就可以完成Web Services自定义身份验证了.IssueVision中还有很多相关的操作,因为在这里只是讨论一下SoapHeader的用法,就不在列举了. <BR>&nbsp;&nbsp; 鄙人见识就这么多了,欢迎大家讨论,提出新的看法.</P></div><img src ="http://www.cnblogs.com/NetFans/aggbug/499516.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>一些常用SQL语句转贴</title><link>http://www.cnblogs.com/NetFans/archive/2006/09/02/NetFans.html</link><dc:creator>NetFans</dc:creator><author>NetFans</author><pubDate>Sat, 02 Sep 2006 10:40:00 GMT</pubDate><guid>http://www.cnblogs.com/NetFans/archive/2006/09/02/NetFans.html</guid><wfw:comment>http://www.cnblogs.com/NetFans/comments/493193.html</wfw:comment><comments>http://www.cnblogs.com/NetFans/archive/2006/09/02/NetFans.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/NetFans/comments/commentRss/493193.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/NetFans/services/trackbacks/493193.html</trackback:ping><description><![CDATA[摘要: SQL语句&nbsp;&nbsp;<a href='http://www.cnblogs.com/NetFans/archive/2006/09/02/NetFans.html'>阅读全文</a><img src ="http://www.cnblogs.com/NetFans/aggbug/493193.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>