<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>郑州网建 - .Net知识问答</title><link>http://camnpr.com/</link><description>Good Good Study ,Day Day Up! - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 100427</generator><language>zh-CN</language><copyright>豫ICP备10013645号 Copyright 2009-2022 camnpr.com</copyright><pubDate>Mon, 04 May 2026 05:40:22 +0800</pubDate><item><title>c# 读取excel时报错：外部表不是预期的格式</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/net-wiki/2086.html</link><pubDate>Thu, 30 Jul 2015 10:27:14 +0800</pubDate><guid>http://camnpr.com/net-wiki/2086.html</guid><description><![CDATA[<div id="noimgcss"><p>读取Excel（扩展名是.xls）的c#代码如下：</p><pre class="brush:c#">/// &lt;summary&gt;<br /> /// 加载Excel - 郑州网建 Camnpr.Com<br /> /// &lt;/summary&gt;<br /> /// &lt;param name=&quot;filePath&quot;&gt;excel文件地址&lt;/param&gt;<br /> /// &lt;returns&gt;DataSet&lt;/returns&gt;<br /> public static DataSet LoadDataFromExcel(string filePath)<br /> {<br />   try<br />   {<br />     string strConn;<br />     //strConn = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; + filePath + &quot;;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'&quot;;<br />     //strConn = &quot;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=&quot; + filePath + &quot;;Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'&quot;;<br />     strConn = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; + filePath + &quot;;Extended Properties=Excel 8.0&quot;;<br />     OleDbConnection OleConn = new OleDbConnection(strConn);<br />     OleConn.Open();<br />     String sql = &quot;SELECT * FROM [Sheet1$]&quot;;//可是更改Sheet名称，比如sheet2，等等<br />     OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);<br />     DataSet OleDsExcle = new DataSet();<br />     OleDaExcel.Fill(OleDsExcle, &quot;Sheet1&quot;);<br />     OleConn.Close();<br />     return OleDsExcle;<br />   }<br />   catch (Exception err)<br />   {<br />     return null;<br />   }<br /> }</pre><p>原因：由于我的电脑上只有Excel2013，保存的格式是：*.xlsx，所以，我修改了扩展名为：.xls</p><p>当我通过上边的c#代码执行时，就报错：外部表不是预期的格式</p><p>因此，猜测是excel格式发生了变化造成的。于是，我打开这个excel，选择文件-》导出-》更改文件类型-》Excel 97-2003工作薄(*.xls)</p><p><img src="http://camnpr.com/upload/2015/7/201507192350507777.jpg" alt="导出转换excel类型：c# excel 外部表不是预期的格式" width="700" height="411" /></p></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/2086.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2086</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2086&amp;key=7a6126ec</trackback:ping></item><item><title>C#读取Excel报错：未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/2085.html</link><pubDate>Wed, 29 Jul 2015 10:20:04 +0800</pubDate><guid>http://camnpr.com/net-wiki/2085.html</guid><description><![CDATA[<div id="noimgcss"><p>解决访问Excel数据源时出现 未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序<br />1、确保安装了Microsoft.ACE.OLEDB.12.0驱动</p><p><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Fdownload%7Cmicrosoft%7Ccom%2Fdownload%2F7%2F0%2F3%2F703ffbcb-dc0c-4e19-b0da-1463960fdcdb%2FAccessDatabaseEngine%7Cexe" target="_blank" rel="nofollow">http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe</a><br />2、在vs中右击项目--》属性--》生成 下的 目标平台 改为x86</p><p><img src="http://camnpr.com/upload/2015/7/201507192324066686.jpg" alt="vs中右击项目--》属性--》生成 下的 目标平台 改为x86" width="700" height="379" /></p><p>如果以上两个方法还是不行的话，用第三个方法</p><p>3、在对应的 IIS 应用程序池中，&ldquo;设置应用程序池默认属性&rdquo;右击/&ldquo;高级设置&rdquo;/&quot;启用32位应用程序&quot;，设置为 true。</p><p>问题：未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序</p></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/2085.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2085</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2085&amp;key=3a7d34b1</trackback:ping></item><item><title>解决Asp.net(c#) 错误A potentially dangerous Request.Form value was detected from the client </title><author>kuabaobao_com@163.com (kuabaobao)</author><link>http://camnpr.com/net-wiki/1987.html</link><pubDate>Tue, 21 Apr 2015 10:29:23 +0800</pubDate><guid>http://camnpr.com/net-wiki/1987.html</guid><description><![CDATA[<div id="noimgcss"><p>近日有客户在升级到Windows 2012 Server后，发现部分表单无法保存，经测试是由于使用了ASP.NET 4.0，默认安全性设置较高造成的。当表单中提交的内容包括&lt;或者&gt;的符号时，就会被服务器作为危险请求而拒绝保存，在ASP.NET 4.0以前，我们可以在aspx页面上方加上ValidateRequest=&rdquo;false&rdquo;来忽略此校验，但在ASP.NET 4.0后，此校验在页面执行以前，因此需要修改全局设定方可忽略此校验。</p><p><strong>Version Information:</strong>&nbsp;Microsoft .NET Framework Version:4.0.21006; ASP.NET Version:4.0.21006.1</p><p><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Ftuond-wordpress%7Cstor%7Csinaapp%7Ccom%2Fuploads%2F2013%2F06%2Fiis-error%7Cpng" target="_blank"><img src="http://camnpr.com/upload/2015/4/iis-error-600x300.png" alt="iis-error" width="600" height="300" /></a></p><p>在IIS 8之后，当页面输入框默认情况下输入&ldquo;&lt;&rdquo;或者&ldquo;&gt;&rdquo;的时候。按照访问策略，这将导致一些安全问题，诸如：跨站脚本攻击<br />（cross-site scripting attack）。而这个问题的更准确描述则是，<strong>当你在安装了.NET Framework<br />4.0以上版本后，当你的应用程序以.NET Framework<br />4.0为框架版本，你的任意服务器请求，都将被进行服务器请求验证（ValidationRequest），这不仅包括ASP.NET，同时也包括Web<br />Services等各种HTTP请求，不仅仅针对aspx页面，也针对HTTP Handler，HTTP<br />Module等，因为这个验证（Valify）的过程，将会发生在BeginRequest事件之前。</strong></p><p>基于以上原理，在ASP.NET之前的版本中，请求验证也是默认开通的，但是发生在页面级（aspx）的，并且只在请求执行的时候生效，因此，在旧的版本中，我们只需要按以下方式配置即可：</p><p class="gc-code">在页面级别（aspx中）设置<br />ValidateRequest=&rdquo;false&rdquo;<br />或者<br />在全局级别（Web.config中）设置</p><pre class="brush:xml">&lt;configuration&gt;<br />&lt;system.web&gt;<br />&lt;pages validateRequest=&quot;false&quot;&gt;</pre><p>但是，以上设置仅对ASP.NET4.0以上有效。在ASP.NET4.0版本上，我们需要更多一行的配置：</p><p class="gc-code">在全局级别（Web.config中）设置</p><pre class="brush:xml">&lt;configuration&gt;<br />&lt;system.web&gt;<br />&lt;httpRuntime requestValidationMode=&quot;2.0&quot;&gt;</pre><p>即在&lt;system.web&gt;一节中增加一行&lt;httpRuntime&nbsp;&nbsp;requestValidationMode=&ldquo;2.0&ldquo;&gt;即可。</p><p>这一点其实在发生错误的页面中已经有说明了。在实际使用过程中，不仅如此，而且我发现requestValidationMode只要设置成小于<br />4.0就可以，比如：1.0，2.0，3.0，3.9都是可以的，错误提示中指明用2.0，目的只是说明用ASP.NET 2.0的默认方式进行工作。</p></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1987.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1987</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1987&amp;key=3065fbb4</trackback:ping></item><item><title>C# RSACryptoServiceProvider类实现RSA（非对称加密）算法（RSAHelper）</title><author>bubuol@126.com (llmaomi)</author><link>http://camnpr.com/net-wiki/1938.html</link><pubDate>Sat, 07 Mar 2015 17:55:30 +0800</pubDate><guid>http://camnpr.com/net-wiki/1938.html</guid><description><![CDATA[<p>1.首先介绍下什么是RSA算法,让大家对RSA算法有个简要的理解.<br />&nbsp;&nbsp; RSA算法非常简单，概述如下:<br />找两素数p和q<br />取n=p*q&nbsp; 如:n=3*7=21<br />取t=(p-1)*(q-1) 如:t = 2*6 = 12<br />&nbsp;　 取任何一个数e,要求满足e&nbsp;<br />取d*e%t==1&nbsp; 如:d=7,e=7,则7*7/12刚好等于1满足要求<br />这样最终得到三个数: n d e,即 n=21,d=7,e=7<br />设消息为数M&nbsp;<br />设c=(M**d)%n就得到了加密后的消息c<br />设m=(c**e)%n则 m == M，从而完成对c的解密。<br />注:**表示次方,上面两式中的d和e可以互换。<br />&nbsp;<br />在对称加密中:<br />n d两个数构成公钥，可以告诉别人;<br />n e两个数构成私钥，e自己保留，不让任何人知道。<br />给别人发送的信息使用e加密，只要别人能用d解开就证明信息是由你发送的，构成了签名机制。<br />别人给你发送信息时使用d加密，这样只有拥有e的你能够对其解密。<br />rsa的安全性在于对于一个大数n，没有有效的方法能够将其分解从而在已知n d的情况无法获得e;同样在已知n e的情况下无法求得d。<br />&nbsp;<br />2.上面就是对RSA算法的一个简要概括,该描述在很多书本上都有介绍,这里也就不做过多解释了,下面我们看下在.net 里面如何实现该算法.<br />&nbsp;&nbsp; 在.net 里面,有一个叫RSACryptoServiceProvider的类,在MSDN中,我们可以了解到该类使用加密服务提供程序 (CSP) 提供的rsa算法的实现,执行不对称加密和解密,从继承关系上我们了解到该类继承自RSA类.通过该类,我们可以导出加密解密所需要的XML信息,并且能够根据我们提供的XML信息进行加密解密计算,下面是对该类的一些具体操作,主要包括如何导出密钥,如何用形成的密钥进行加密和解密,完成我们一般的操作.</p><pre class="brush:c#">&nbsp;&nbsp; public class Cyh_RSA<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cyh_RSA()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 加密<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_inputString&quot;&gt;需要加密的字符串信息&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_strKeyPath&quot;&gt;加密用的密钥所在的路径(*.cyh_publickey)&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;加密以后的字符串信息&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Encrypt(string p_inputString, string p_strKeyPath)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string fileString = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string outString = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (File.Exists(p_strKeyPath))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamReader streamReader = new StreamReader(p_strKeyPath, true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileString = streamReader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; streamReader.Close();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileString != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string bitStrengthString = fileString.Substring(0, fileString.IndexOf(&quot;&lt;/BitStrength&gt;&quot;) + 14);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileString = fileString.Replace(bitStrengthString, &quot;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bitStrength = Convert.ToInt32(bitStrengthString.Replace(&quot;&lt;BitStrength&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/BitStrength&gt;&quot;, &quot;&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outString = EncryptString(p_inputString, bitStrength, fileString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception Ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(&quot;出错: \n&quot; + Ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return outString;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 解密<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_inputString&quot;&gt;需要解密的字符串信息&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_strKeyPath&quot;&gt;解密用的密钥所在的路径(*.cyh_primarykey)&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;解密以后的字符串信息&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Decrypt(string p_inputString, string p_strKeyPath)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string fileString = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string outString = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (File.Exists(p_strKeyPath))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamReader streamReader = new StreamReader(p_strKeyPath, true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileString = streamReader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; streamReader.Close();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileString != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string bitStrengthString = fileString.Substring(0, fileString.IndexOf(&quot;&lt;/BitStrength&gt;&quot;) + 14);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileString = fileString.Replace(bitStrengthString, &quot;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bitStrength = Convert.ToInt32(bitStrengthString.Replace(&quot;&lt;BitStrength&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/BitStrength&gt;&quot;, &quot;&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outString = DecryptString(p_inputString, bitStrength, fileString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception Ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(&quot;出错: \n&quot; + Ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return outString;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 加密<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_inputString&quot;&gt;需要加密的字符串&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_dwKeySize&quot;&gt;密钥的大小&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_xmlString&quot;&gt;包含密钥的XML文本信息&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;加密后的文本信息&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string EncryptString(string p_inputString, int p_dwKeySize, string p_xmlString)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(p_dwKeySize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rsaCryptoServiceProvider.FromXmlString(p_xmlString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int keySize = p_dwKeySize / 8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytes = Encoding.UTF32.GetBytes(p_inputString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxLength = keySize - 42;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dataLength = bytes.Length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iterations = dataLength / maxLength;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder stringBuilder = new StringBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;= iterations; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] tempBytes = new byte[(dataLength - maxLength * i &gt; maxLength) ? maxLength : dataLength - maxLength * i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.Reverse(encryptedBytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stringBuilder.Append(Convert.ToBase64String(encryptedBytes));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return stringBuilder.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 解密<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_inputString&quot;&gt;需要解密的字符串信息&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_dwKeySize&quot;&gt;密钥的大小&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_xmlString&quot;&gt;包含密钥的文本信息&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;解密后的文本信息&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string DecryptString(string inputString, int dwKeySize, string xmlString)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(dwKeySize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rsaCryptoServiceProvider.FromXmlString(xmlString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int base64BlockSize = ((dwKeySize / 8) % 3 != 0) ? (((dwKeySize / 8) / 3) * 4) + 4 : ((dwKeySize / 8) / 3) * 4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iterations = inputString.Length / base64BlockSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList arrayList = new ArrayList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; iterations; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] encryptedBytes = Convert.FromBase64String(inputString.Substring(base64BlockSize * i, base64BlockSize));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.Reverse(encryptedBytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(encryptedBytes, true));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Encoding.UTF32.GetString(arrayList.ToArray(Type.GetType(&quot;System.Byte&quot;)) as byte[]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 形成并保存公开密钥和私有密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_currentBitStrength&quot;&gt;密钥大小&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SaveKey(int p_currentBitStrength)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSACryptoServiceProvider RSAProvider = new RSACryptoServiceProvider(p_currentBitStrength);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string publicAndPrivateKeys = &quot;&lt;BitStrength&gt;&quot; + p_currentBitStrength.ToString() + &quot;&lt;/BitStrength&gt;&quot; + RSAProvider.ToXmlString(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string justPublicKey = &quot;&lt;BitStrength&gt;&quot; + p_currentBitStrength.ToString() + &quot;&lt;/BitStrength&gt;&quot; + RSAProvider.ToXmlString(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (saveFile(&quot;Save Public/Private Keys As&quot;, &quot;Public/Private Keys Document( *.cyh_primarykey )|*.cyh_primarykey&quot;, publicAndPrivateKeys))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { while (!saveFile(&quot;Save Public Key As&quot;, &quot;Public Key Document( *.cyh_publickey )|*.cyh_publickey&quot;, justPublicKey)) { ; } }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 保存信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_title&quot;&gt;标题&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_filterString&quot;&gt;过滤条件&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;p_outputString&quot;&gt;输出内容&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;是否成功&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool saveFile(string p_title, string p_filterString, string p_outputString)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SaveFileDialog saveFileDialog = new SaveFileDialog();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFileDialog.Title = p_title;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFileDialog.Filter = p_filterString;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFileDialog.FileName = &quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (saveFileDialog.ShowDialog() == DialogResult.OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName, false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p_outputString != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { streamWriter.Write(p_outputString); }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; streamWriter.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception Ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</pre><p><br />这样,您在任何地方都可以使用该类对数据进行加密和解密,并且操作相当方便,如:<br />生成密钥:</p><pre class="brush:c#">&nbsp;Cyh_RSA rsa = new Cyh_RSA();<br />&nbsp;rsa.SaveKey(1024);</pre><p><br />加密:</p><pre class="brush:c#">Cyh_RSA rsa = new Cyh_RSA();<br />rsa.Encrypt(&quot;需要加密的内容&quot;, &quot;包含密钥的路径&quot;);</pre><p><br />解密:</p><pre class="brush:c#">Cyh_RSA rsa = new Cyh_RSA();<br />rsa.Decrypt(&quot;需要解密的内容&quot;, &quot;包含密钥的路径&quot;);</pre>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1938.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1938</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1938&amp;key=53f2a9be</trackback:ping></item><item><title>ASP.NET(C#)webservice的简单示例</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1904.html</link><pubDate>Wed, 18 Feb 2015 11:10:33 +0800</pubDate><guid>http://camnpr.com/net-wiki/1904.html</guid><description><![CDATA[<div id="noimgcss"><div><p align="left">是webservice.就概念上来说，可能比较复杂，不过我们可以有个宏观的了解：webservice就是个对外的接口，里面有&nbsp;<wbr></wbr>函数可供外部客户调用（注意：里面同样有客户不可调用的函数）。假若我们是服务端，我们写好了个webservice，然后把它给了客户（同时我们给了他们调用规则），客户就可以在从服务端获取信息时处于一个相对透明的状态。即使客户不了解（也不需要）其过程，他们只获取数据。</p><p align="left">　　webservice传递的数据只能是序列化的数据，典型的就是xml数据。</p><p align="left">下面以一个简单例子为例：</p><p align="left">（一）新建&mdash;&mdash;－项目--－Visual C#---<span style="color: #0000ff;" data-mce-style="color: #0000ff;">web---ASP.NET Web 服务应用程序</span>,命名为TestWebService</p><p align="left">此时的目录结构如图所示：</p><p align="left"><img title="ｃ＃webservice的简单示例" src="http://camnpr.com/upload/2015/1/201501291527128504.jpg" alt="ASP.NET(C#)webservice的简单示例" height="99" /></p><p align="left">我们修改Service1.asmx的名字为：MyService.asmx</p><p align="left">同时修改文件中的class名&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr></p><p align="left">public class&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">MyService</span>: System.Web.Services.WebService<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;{</p><p align="left">&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;[WebMethod]<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;public string HelloWorld()<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;{<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;return &quot;Hello World&quot;;<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;}<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;}</p><p align="left">同时修改文件MyService.asmx（<span style="color: #0000ff;" data-mce-style="color: #0000ff;">右击--查看标记</span>；如果在vs环境下双击打开的是.cs文件）</p><p align="left">&lt;%@ WebService Language=&quot;C#&quot; CodeBehind=&quot;MyService.asmx.cs&quot; Class=&quot;TestWebService.Service1&quot; %&gt;改为</p><p align="left">&lt;%@ WebService Language=&quot;C#&quot; CodeBehind=&quot;MyService.asmx.cs&quot; Class=&quot;TestWebService.<span style="color: #0000ff;" data-mce-style="color: #0000ff;">MyService</span>&quot; %&gt;</p><p align="left">&nbsp;<wbr></wbr></p><p align="left">（二）重新生成项目，右击MyService.asmx，选择&ldquo;在浏览器中查看&rdquo;，即可检查本项目是否有语法错误</p><p align="left">（三）在MyService.asmx添加指定方法</p><p align="left">using System;<br />using System.Data;<br />using System.Web;<br />using System.Collections;<br />using System.Web.Services;<br />using System.Web.Services.Protocols;<br />using System.ComponentModel;</p><p align="left">namespace TestWebService<br />{<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;/// &lt;summary&gt;<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;/// Service1 的摘要说明<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;/// &lt;/summary&gt;<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;[WebService(Namespace = &quot;http://tempuri.org/&quot;)]<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;[ToolboxItem(false)]<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;public class&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">MyService</span>: System.Web.Services.WebService<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;{</p><p align="left">&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">[WebMethod]//<span style="color: #ff00ff;" data-mce-style="color: #ff00ff;">必须要有的，为了说明，其下是一个方法，每一个方法前面都需要有。</span><br /></span>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;public string getName()<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;{<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;return &quot;Hope&quot;;<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;}</p><p align="left">&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">[WebMethod]<br /></span>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;public string getAge()<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;{<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;return &quot;25&quot;;<br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;}<br /><br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;}<br />}</p><p align="left">重新生成项目，右击MyService.asmx，选择&ldquo;在浏览器中查看&rdquo;,效果如下：</p><p align="left">&nbsp;<wbr></wbr></p><p align="left">&nbsp;<wbr></wbr><img title="ASP.NET(C#)webservice的简单示例" src="http://camnpr.com/upload/2015/1/201501291527302100.jpg" alt="ASP.NET(C#)webservice的简单示例" height="253" /></p></div><p>（四）发布在外网上</p><p>这里我是在本机上测试的，所以没有必要发布。如果要发布到外网上，我们可以通过：</p><p>把bin文件下的文件以及与bin（包括.dll和.pdb文件）同级目录的asmx文件上传到外网即可。</p><p>（五）使用web service接口。</p><p>新建一个普通的windows应用程序，右击，<span style="color: #0000ff;" data-mce-style="color: #0000ff;">添加web引用</span>----</p><p>如图：</p><p><img title="ｃ＃webservice的简单示例" src="http://camnpr.com/upload/2015/1/201501291527397515.jpg" alt="ASP.NET(C#)webservice的简单示例" height="384" width="580" /></p><p>改一下web引用名为：HopeWebService如图：</p><p><img title="ｃ＃webservice的简单示例" src="http://camnpr.com/upload/2015/1/201501291527466825.jpg" alt="ｃ＃webservice的简单示例" height="230" /></p><p>此时，我们可以使用webservice中的方法了。通过HopeWebService我们可以访问其中的两个方法。</p><p>（六）使用方法：</p><p>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">HopeWebService.MyService obj = new HopeWebService.MyService();</span><br />&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;MessageBox.Show(&quot;name is:&quot; +&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">obj.getName</span>()+&quot;;age is:&quot; +&nbsp;<span style="color: #0000ff;" data-mce-style="color: #0000ff;">obj.getAge</span>());</p></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1904.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1904</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1904&amp;key=6036e743</trackback:ping></item><item><title>解决input type=&amp;quot;hidden&amp;quot; name=&amp;quot;__VIEWSTATE&amp;quot; id=&amp;quot;__VIEWSTATE&amp;quot; 过长</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1554.html</link><pubDate>Tue, 05 Aug 2014 10:37:29 +0800</pubDate><guid>http://camnpr.com/net-wiki/1554.html</guid><description><![CDATA[<p><span class="webkit-html-tag">&lt;input <span class="webkit-html-attribute-name">type</span>=&quot;<span class="webkit-html-attribute-value">hidden</span>&quot; <span class="webkit-html-attribute-name">name</span>=&quot;<span class="webkit-html-attribute-value">__VIEWSTATE</span>&quot; <span class="webkit-html-attribute-name">id</span>=&quot;<span class="webkit-html-attribute-value">__VIEWSTATE</span>&quot; <span class="webkit-html-attribute-name">value</span>=&quot;<span class="webkit-html-attribute-value">/wEPDwULLTEyMTgwNTMyMTEPZBYCAgMPZBYKAgEPZBYCAgEPFgI....BjbGFzcz0iTGdhcCB....lw0BdkzvyE</span>&quot; /&gt;</span>&nbsp; 省略号代表：省略一万字~。。。。</p><p>　　这么长的代码那容易就相当的大，访问也就慢很多。</p><p>　　在顶部中加入 EnableViewState=&quot;false&quot; ，就可以去掉了，前提是你用不到它 ，我加了EnableViewState=&quot;false&quot;</p><p>　　之前是 &lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;default.aspx.cs&quot; Inherits=&quot;camnpr.index2&quot; %&gt;</p><p>　　之后成 &lt;%@ Page Language=&quot;C#&quot; <span style="color: rgb(255, 0, 0);" data-mce-style="color: rgb(255, 0, 0);"><strong>EnableViewState=&quot;false&quot;</strong></span> AutoEventWireup=&quot;true&quot; CodeFile=&quot;default.aspx.cs&quot; Inherits=&quot;camnpr.index2&quot; %&gt;</p><p>　　代码就不在了，我就测试登陆和搜索有没有错误，没有错误。就是代表这代码是利用到。</p>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1554.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1554</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1554&amp;key=2425aa2a</trackback:ping></item><item><title>【VC#】Unable to find a version of the runtime to run this application(.net)</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1526.html</link><pubDate>Sun, 27 Jul 2014 13:07:27 +0800</pubDate><guid>http://camnpr.com/net-wiki/1526.html</guid><description><![CDATA[<div id="noimgcss"><p><span class="itemTitle">错误现象</span></p><p>运行 VC# 程序，提示如下：</p><div class="quote">Unable to find a version of the runtime to run this application.</div><p class="illustration"><img src="http://camnpr.com/upload/2014/7/201407271307260512.png" alt=".NET Framework" border="0" ></p><p><span class="itemTitle">初探原因</span></p><p>这表示缺少对应版本的 .NET 运行库，需下载相应的 .NET Framework。说白了，就是需要安装运行环境，就像您安装一些游戏软件，要求您先装什么什么一样。</p><p><span class="itemTitle">深究原因</span></p><p>微软的 .NET Framework 版本大致有：1.x 系列、2.0、3.0、3.5 SP1、4.0、4.5。</p><ul><li><span class="key">1.x 系列</span>很老了，当时 .NET 还不成熟，可以忽略；</li><li><span class="key">2.0、3.0、3.5 SP1</span>&nbsp;基架都是 2.0，安装了 3.5 SP1，那么在 3.5 SP1、3.0、2.0 上开发的软件都能用，所以我们一般下载高版本的 3.5 SP1（要求至少是 Windows XP SP2）；</li><li><span class="key">4.0</span>&nbsp;要求至少是 Windows XP SP3，这个版本不包括之前的版本，也就是说并不是说安了 4.0，就可以运行在 3.5 SP1、3.0、2.0 上开发的软件，它只能运行在 4.0 上开发的软件。</li><li><span class="key">4.5</span>&nbsp;要求至少是 Windows Vista SP2、Windows 7 SP1，我相信在中国，极少有人敢用这个版本来开发，因为中国大部分还是 Windows XP 用户啊，所以这个也可以忽略。</li></ul><p><span class="itemTitle">解决办法</span></p><p>也就是说，如果不确定是在哪个版本下开发的软件，建议把 3.5 SP1、4.0 都安装了。</p><p><span class="itemTitle">下载地址</span></p><ul><li><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Fwww%7Cmicrosoft%7Ccom%2Fzh-cn%2Fdownload%2Fdetails%7Caspx%3Fid%3D25150" target="_blank" >.NET Framework 3.5 Service Pack 1</a></li><li><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Fwww%7Cmicrosoft%7Ccom%2Fzh-cn%2Fdownload%2Fdetails%7Caspx%3Fid%3D17718" target="_blank" >.NET Framework 4.0</a></li><li><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Fwww%7Cmicrosoft%7Ccom%2Fzh-cn%2Fdownload%2Fdetails%7Caspx%3Fid%3D30653" target="_blank" >.NET Framework 4.5</a></li></ul><p><span class="caution">注意：</span>虽然本文给的下载地址是官方完整安装包的链接，但是在安装过程中，安装程序还是需要到网上去下载一个语言包（自动下载），所以在安装过程中，应该保持计算机联网。</p></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1526.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1526</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1526&amp;key=35a610b2</trackback:ping></item><item><title>【C#】抓取（获取）网页内容抓取图片的代码示例</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1522.html</link><pubDate>Sat, 26 Jul 2014 00:00:54 +0800</pubDate><guid>http://camnpr.com/net-wiki/1522.html</guid><description><![CDATA[<p>1、抓取一般内容<br>需要三个类：WebRequest、WebResponse、StreamReader<br>所需命名空间：System.Net、System.IO<br>核心代码：<br></p><pre class="brush:c#">WebRequest request = WebRequest.Create("http://camnpr.com/"); <br>WebResponse response = request.GetResponse(); <br>StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); </pre><p><br> WebRequest 类的 Create 为静态方法，参数为要抓取的网页的网址；<br> Encoding 指定编码，Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码，但没有 gb2312 这个编码属性，所以我们使用 GetEncoding 获得 gb2312 编码。<br>示例：<br></p><pre class="brush:c#">&lt;%@ Page Language="C#" %&gt; <br>&lt;%@ Import Namespace="System.Net" %&gt; <br>&lt;%@ Import Namespace="System.IO" %&gt; <br>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; <br>&lt;mce:script runat="server"&gt;&lt;!-- <br> void Page_Load(object sender, EventArgs e) <br> { <br> try <br> { <br> WebRequest request = WebRequest.Create("http://camnpr.com/"); <br> WebResponse response = request.GetResponse(); <br> StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); <br> <br> tb.Text = reader.ReadToEnd(); <br> <br> reader.Close(); <br> reader.Dispose(); <br> response.Close(); <br> } <br> catch (Exception ex) <br> { <br> tb.Text = ex.Message; <br> } <br> } <br>// --&gt;&lt;/mce:script&gt; <br>&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt; <br>&lt;head runat="server"&gt; <br> &lt;title&gt;抓取网页内容 - 郑州网建&lt;/title&gt; <br>&lt;/head&gt; <br>&lt;body&gt; <br> &lt;form id="form1" runat="server"&gt; <br> &lt;div&gt; <br> &lt;asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"&gt;&lt;/asp:TextBox&gt; <br> &lt;/div&gt; <br> &lt;/form&gt; <br>&lt;/body&gt; <br>&lt;/html&gt;</pre><p><br> <br> 2 抓取网页内容－图片<br> 需要四个类：WebRequest、WebResponse、Stream、FileStream。<br> 示例：<br></p><pre class="brush:c#">&lt;%@ Page Language="C#" %&gt; <br>&lt;%@ Import Namespace="System.Net" %&gt; <br>&lt;%@ Import Namespace="System.IO" %&gt; <br>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; <br>&lt;mce:script runat="server"&gt;&lt;!-- <br> void Page_Load(object sender, EventArgs e) <br> { <br> try <br> { <br> WebRequest request = WebRequest.Create("http://camnpr.com/images/logo.gif"); <br> WebResponse response = request.GetResponse(); <br> Stream reader = response.GetResponseStream(); <br> <br> FileStream writer = new FileStream("D://logo.gif", FileMode.OpenOrCreate, FileAccess.Write); <br> byte[] buff = new byte[512]; <br> int c = 0; //实际读取的字节数 <br> while ((c=reader.Read(buff, 0, buff.Length)) &gt; 0) <br> { <br> writer.Write(buff, 0, c); <br> } <br> writer.Close(); <br> writer.Dispose(); <br> <br> reader.Close(); <br> reader.Dispose(); <br> response.Close(); <br> <br> tb.Text = "保存成功！"; <br> } <br> catch (Exception ex) <br> { <br> tb.Text = ex.Message; <br> } <br> } <br>// --&gt;&lt;/mce:script&gt; <br>&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt; <br>&lt;head runat="server"&gt; <br> &lt;title&gt;抓取网页图片并保存 - 郑州网建&lt;/title&gt; <br>&lt;/head&gt; <br>&lt;body&gt; <br> &lt;form id="form1" runat="server"&gt; <br> &lt;div&gt; <br> &lt;asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"&gt;&lt;/asp:TextBox&gt; <br> &lt;/div&gt; <br> &lt;/form&gt; <br>&lt;/body&gt; <br>&lt;/html&gt; </pre><p><br> <br>3 抓取网页内容－Post 数据<br> 在抓取网页时，有时候，需要将某些数据通过 Post 的方式发送到服务器，将以下代码添加在网页抓取的程序中，以实现将用户名和密码 Post 到服务器<br></p><pre class="brush:c#">string data = "userName=admin&amp;passwd=admin888"; <br>byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data); <br> <br>request.Method = "POST"; <br>request.ContentType = "application/x-www-form-urlencoded"; <br>request.ContentLength = requestBuffer.Length; <br>using (Stream requestStream = request.GetRequestStream()) <br>{ <br> requestStream.Write(requestBuffer, 0, requestBuffer.Length); <br> requestStream.Close(); <br>} <br> <br>using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"))) <br>{ <br> string str = reader.ReadToEnd(); <br> reader.Close(); <br>} </pre><p><br> <br>4 抓取网页内容－防止重定向<br>在抓取网页时，成功登录服务器应用系统后，应用系统可能会通过 Response.Redirect 将网页进行重定向，如果不需要响应这个重定向，那么，我们就不要把 reader.ReadToEnd() 给 Response.Write 出来，就可以了。<br>5 抓取网页内容－保持登录状态<br> <br>利用 Post 数据成功登录服务器应用系统后，就可以抓取需要登录的页面了，那么我们就可能需要在多个 Request 间保持登录状态。<br>首先，我们要使用 HttpWebRequest，而不是 WebRequest。<br>与 WebRequest 相比，变化的代码是：<br></p><pre class="brush:c#">HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); </pre><p><br> <br>注意：HttpWebRequest.Create 返回的类型仍是 WebRequest，所以要转化一下。<br>其次，使用 CookieContainer。<br></p><pre class="brush:c#">System.Net.CookieContainer cc = new System.Net.CookieContainer(); <br>request.CookieContainer = cc; <br>request2.CookieContainer = cc; </pre><p><br> <br>这样 request 和 request2 之间就使用了相同的 Session，如果 request 登录了，那么 request2 也是登录状态。<br>最后，如何在不同的页面间使用同一个 CookieContainer。<br>要在不同的页面间使用同一个 CookieContainer，只有把 CookieContainer 加入 Session。<br> <br></p><pre class="brush:c#">Session.Add("ccc", cc); //存 <br> <br>CookieContainer cc = (CookieContainer)Session["ccc"]; //取 </pre><p><br> <br>5 抓取网页内容－把当前会话带到 WebRequest 中<br> <br>比如说浏览器 B1 去访问服务器端 S1，这会产生一个会话，而服务器端 S2 再用 WebRequest 去访问服务器端 S1，这又会产生一个会话。现在的需求是让 WebRequest 使用浏览器 B1 与 S1 之间的会话，也就是说要让 S1 认为是 B1 在访问 S1，而不是 S2 在访问 S1。<br>这就要利用 Cookie 了，先在 S1 中取得与 B1 的 SessionID 的 Cookie，再将这个 Cookie 告诉 S2，S2 再将 Cookie 写在 WebRequest 中。<br></p><pre class="brush:c#">WebRequest request = WebRequest.Create("url"); <br>&lt;SPAN class=key&gt;request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");&lt;/SPAN&gt; <br>WebResponse response = request.GetResponse(); <br>StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312")); <br>Response.Write(reader.ReadToEnd()); <br>reader.Close(); <br>reader.Dispose(); <br>response.Close(); </pre><p><br> <br>要说明的是：<br>本文并不是 Cookie 欺骗，因为 SessionID 是 S1 告诉 S2 的，并不是 S2 窃取的，虽然有些古怪，但这可能在一些特定的应用系统中会有用。<br>S1 必须要向 B1 写 Session，这样 SessionID 才会保存到 Cookie 中，并且 SessionID 才会保持不变。<br>在 ASP.NET 中取 Cookie 用 Request.Cookies，本文假设 Cookie 已经取出来。<br>不同的服务器端语言，SessionID 在 Cookie 中上名称并不一样，本文是 ASP 的 SessionID。<br>S1 可能不仅仅依靠 SessionID 来判断当前登录，它可能还会辅助于 Referer、User-Agent 等，这取决于 S1 端程序的设计。<br>其实本文算是本连载中“保持登录状态”的另一种方法。<br>6 抓取网页内容－如何更改来源 Referer 和 UserAgent<br></p><pre class="brush:c#">&lt;SPAN class=caution&gt;HttpWebRequest&lt;/SPAN&gt; request = &lt;SPAN class=caution&gt;(HttpWebRequest)HttpWebRequest&lt;/SPAN&gt;.Create("http://127.0.0.1/index.htm"); <br>//request.Headers.Add(HttpRequestHeader.Referer, "http://camnpr.com/"); // 错误 <br>//request.Headers[HttpRequestHeader.Referer] = "http://camnpr.com/"; // 错误 <br>&lt;SPAN class=caution&gt;request.Referer&lt;/SPAN&gt; = "http://camnpr.com/"; // 正确 </pre><p><br> <br>注释掉的两句是不对的，会发生错误：<br>此标头必须使用适当的属性进行修改。 <br>参数名: name <br> <br>UserAgent 类似。</p>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1522.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1522</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1522&amp;key=222312ed</trackback:ping></item><item><title>解决ASPJPEG组件生成图片文字水印时，汉字乱码的方法</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1496.html</link><pubDate>Sat, 19 Jul 2014 13:26:15 +0800</pubDate><guid>http://camnpr.com/net-wiki/1496.html</guid><description><![CDATA[<div id="paragraph" class="post_content"><p>一个图片网站上传到服务器上后做测试，发现在用ASPJPEG组件生成水印时，汉字竟然是乱码，然后就想ASPJPEG组件里应该有给要生成的文字设置编码的命令，但是找了半天都发现，站长自己试了好多方法，生成出来的图片上的汉字水印都是乱码，无意中更换了下生成水印时设置的字符集，没想到问题竟然解决了：</p><p>&nbsp;</p><pre class="brush:c#">jpeg.Canvas.Font.Color = &amp;HFF0000 ' Red<br />	jpeg.Canvas.Font.Family = &quot;宋体_GB2312&quot; '就是这一句解决了汉字水印乱码的问题<br />	jpeg.Canvas.Font.Bold = True<br />	jpeg.Canvas.Font.Size = 22<br />	jpeg.Canvas.Font.Quality = 4 ' Antialiased<br />	jpeg.Canvas.Font.BkMode = &quot;Opaque&quot; ' to make antialiasing work<br />	jpeg.Canvas.Print PicWidth-600,PicHeight-30,title </pre></div>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1496.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1496</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1496&amp;key=302caedd</trackback:ping></item><item><title>asp0113 脚本超时:Active Server Pages 错误‘ASP 0113‘脚本超时 Server.ScriptTimeOut</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/net-wiki/1494.html</link><pubDate>Sat, 19 Jul 2014 12:40:38 +0800</pubDate><guid>http://camnpr.com/net-wiki/1494.html</guid><description><![CDATA[<p><strong>问题现象：</strong>Active Server Pages 错误 'ASP 0113'出现的错误<br><br>Active Server Pages 错误 'ASP 0113'<br>脚本超时<br>　　超过了脚本运行的最长时间。可以为 Server.ScriptTimeOut 属性指定新值或更改 IIS 管理工具中的相应值来更改此限制。<br><br>　　前两天还能正常显示所有的文章内容，可是这两天都是这样子，假如你多刷新几次也许还能正常显示出来；程序出现的死循环可以排除掉。<br>　　我用的数据库是SQL的，数据量上面应该没有什么问题；<br>　　我那天查询一下我们的数据库空间，我是租其他公司的数据库空间，大小是180M<br>　　还剩下三四十M了现在，是不是这个数据库剩余的空间大小了，进行数据库查询的时候运行的时间也超时了？不明白，还有一点说明是，我使用同一个文件时行数据查询时，假如只看某一下栏目下的文章时，是很快就有数据出现的，就是显示所有的栏目下的文章时，出现上面的提示，这倒底是什么原因，请高手帮帮忙！！<br><br><strong>解决方法：</strong><br>　　数据库表中读取记录过多，你的SQL语句没有优化，机器访问速度太慢都会出现这样的问题，把SQL语句优化一下，SQLServer 的话用存储过程解决。<br>　　希望下面方法可以帮你解决此问题<br><br><strong>方法一</strong><br>　　可以增加时间所允许进行 ASP 脚本对特定网站。 要这样, 将 Internet Information Server (IIS) 元数据库值：<br>　　1.打开 Internet 服务管理器。<br>　　2.展开树并右击 默认 Web 站点 （或具有问题站点）。<br>　　3.单击 属性。<br>　　4.单击 主目录 选项卡。<br>　　5.在 应用程序设置 , 单击 配置。<br>　　6.单击 App 选项 选项卡。<br>　　7.ASP 脚本超 值增加到数字以防止脚本超时足够高。<br><strong>方法二</strong><br>　　可以增加允许对所有 Web 站点进行 ASP 脚本时间。 要这样, 将在 IIS 元数据库值<br>　　1.打开 Internet 服务管理器。<br>　　2.右键单击计算机的名称。<br>　　3.单击 属性。<br>　　4.主属性,中选择 WWW 服务,然后单击 编辑。<br>　　5.单击 主目录 选项卡。<br>　　6.在 应用程序设置,单击 配置 。<br>　　7.单击 App选项 选项卡。<br>　　8.ASP 脚本超 值增加到数字以防止脚本超时足够高。<br>方法三<br>　　Server.ScriptTimeOut 属性可用于编程增加 ScriptTimeOut 属性值在 ASP 中页级别。 例如, 如果需要 3 分钟以传递之前处理超, 脚本添加到 ASP 页以下行：<br>　　Server.ScriptTimeout = 180</p>]]></description><category>.Net知识问答</category><comments>http://camnpr.com/net-wiki/1494.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1494</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1494&amp;key=154d1167</trackback:ping></item></channel></rss>
