一个 http 请求类 ,支持文件上传,从淘宝 top sdk 里面扣出来的,蛮好用的,做个记录而已。

调用代码:

  1.        Dictionary<string, string> textParas = new Dictionary<string, string>();
  2. textParas.Add("username", "jersey");
  3. textParas.Add("password", "000000");
  4.  
  5. Dictionary<string, FileItem> fileParas = new Dictionary<string, FileItem>();
  6. fileParas.Add("file1", new FileItem("E:\\123.jpg"));
  7. fileParas.Add("file2", new FileItem("E:\\123.jpg"));
  8.  
  9. WebUtils webUtils=new WebUtils();
  10. webUtils.Timeout=50000;
  11. webUtils.DoPost("http://www.baidu.com/api/index.php",textParas,fileParas,null);

  

类代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Net;
  6. using System.Net.Security;
  7. using System.Security.Cryptography.X509Certificates;
  8. using System.Text;
  9. using System.Web;
  10.  
  11. namespace tools
  12. {
  13. /// <summary>
  14. /// 网络工具类。
  15. /// </summary>
  16. public sealed class WebUtils
  17. {
  18. private int _timeout = 20000;
  19. private int _readWriteTimeout = 60000;
  20. private bool _ignoreSSLCheck = true;
  21. private bool _disableWebProxy = false;
  22.  
  23. /// <summary>
  24. /// 等待请求开始返回的超时时间
  25. /// </summary>
  26. public int Timeout
  27. {
  28. get { return this._timeout; }
  29. set { this._timeout = value; }
  30. }
  31.  
  32. /// <summary>
  33. /// 等待读取数据完成的超时时间
  34. /// </summary>
  35. public int ReadWriteTimeout
  36. {
  37. get { return this._readWriteTimeout; }
  38. set { this._readWriteTimeout = value; }
  39. }
  40.  
  41. /// <summary>
  42. /// 是否忽略SSL检查
  43. /// </summary>
  44. public bool IgnoreSSLCheck
  45. {
  46. get { return this._ignoreSSLCheck; }
  47. set { this._ignoreSSLCheck = value; }
  48. }
  49.  
  50. /// <summary>
  51. /// 是否禁用本地代理
  52. /// </summary>
  53. public bool DisableWebProxy
  54. {
  55. get { return this._disableWebProxy; }
  56. set { this._disableWebProxy = value; }
  57. }
  58.  
  59. /// <summary>
  60. /// 执行HTTP POST请求。
  61. /// </summary>
  62. /// <param name="url">请求地址</param>
  63. /// <param name="textParams">请求文本参数</param>
  64. /// <returns>HTTP响应</returns>
  65. public string DoPost(string url, IDictionary<string, string> textParams)
  66. {
  67. return DoPost(url, textParams, null);
  68. }
  69.  
  70. /// <summary>
  71. /// 执行HTTP POST请求。
  72. /// </summary>
  73. /// <param name="url">请求地址</param>
  74. /// <param name="textParams">请求文本参数</param>
  75. /// <param name="headerParams">请求头部参数</param>
  76. /// <returns>HTTP响应</returns>
  77. public string DoPost(string url, IDictionary<string, string> textParams, IDictionary<string, string> headerParams)
  78. {
  79. HttpWebRequest req = GetWebRequest(url, "POST", headerParams);
  80. req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
  81.  
  82. byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(textParams));
  83. System.IO.Stream reqStream = req.GetRequestStream();
  84. reqStream.Write(postData, 0, postData.Length);
  85. reqStream.Close();
  86.  
  87. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  88. Encoding encoding = GetResponseEncoding(rsp);
  89. return GetResponseAsString(rsp, encoding);
  90. }
  91.  
  92. /// <summary>
  93. /// 执行HTTP GET请求。
  94. /// </summary>
  95. /// <param name="url">请求地址</param>
  96. /// <param name="textParams">请求文本参数</param>
  97. /// <returns>HTTP响应</returns>
  98. public string DoGet(string url, IDictionary<string, string> textParams)
  99. {
  100. return DoGet(url, textParams, null);
  101. }
  102.  
  103. /// <summary>
  104. /// 执行HTTP GET请求。
  105. /// </summary>
  106. /// <param name="url">请求地址</param>
  107. /// <param name="textParams">请求文本参数</param>
  108. /// <param name="headerParams">请求头部参数</param>
  109. /// <returns>HTTP响应</returns>
  110. public string DoGet(string url, IDictionary<string, string> textParams, IDictionary<string, string> headerParams)
  111. {
  112. if (textParams != null && textParams.Count > 0)
  113. {
  114. url = BuildRequestUrl(url, textParams);
  115. }
  116.  
  117. HttpWebRequest req = GetWebRequest(url, "GET", headerParams);
  118. req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
  119.  
  120. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  121. Encoding encoding = GetResponseEncoding(rsp);
  122. return GetResponseAsString(rsp, encoding);
  123. }
  124.  
  125. /// <summary>
  126. /// 执行带文件上传的HTTP POST请求。
  127. /// </summary>
  128. /// <param name="url">请求地址</param>
  129. /// <param name="textParams">请求文本参数</param>
  130. /// <param name="fileParams">请求文件参数</param>
  131. /// <param name="headerParams">请求头部参数</param>
  132. /// <returns>HTTP响应</returns>
  133. public string DoPost(string url, IDictionary<string, string> textParams, IDictionary<string, FileItem> fileParams, IDictionary<string, string> headerParams)
  134. {
  135. // 如果没有文件参数,则走普通POST请求
  136. if (fileParams == null || fileParams.Count == 0)
  137. {
  138. return DoPost(url, textParams, headerParams);
  139. }
  140.  
  141. string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
  142.  
  143. HttpWebRequest req = GetWebRequest(url, "POST", headerParams);
  144. req.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
  145.  
  146. System.IO.Stream reqStream = req.GetRequestStream();
  147. byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
  148. byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
  149.  
  150. // 组装文本请求参数
  151. string textTemplate = "Content-Disposition:form-data;name=\"{0}\"\r\nContent-Type:text/plain\r\n\r\n{1}";
  152. foreach (KeyValuePair<string, string> kv in textParams)
  153. {
  154. string textEntry = string.Format(textTemplate, kv.Key, kv.Value);
  155. byte[] itemBytes = Encoding.UTF8.GetBytes(textEntry);
  156. reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
  157. reqStream.Write(itemBytes, 0, itemBytes.Length);
  158. }
  159.  
  160. // 组装文件请求参数
  161. string fileTemplate = "Content-Disposition:form-data;name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
  162. foreach (KeyValuePair<string, FileItem> kv in fileParams)
  163. {
  164. string key = kv.Key;
  165. FileItem fileItem = kv.Value;
  166. if (!fileItem.IsValid())
  167. {
  168. throw new ArgumentException("FileItem is invalid");
  169. }
  170. string fileEntry = string.Format(fileTemplate, key, fileItem.GetFileName(), fileItem.GetMimeType());
  171. byte[] itemBytes = Encoding.UTF8.GetBytes(fileEntry);
  172. reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
  173. reqStream.Write(itemBytes, 0, itemBytes.Length);
  174. fileItem.Write(reqStream);
  175. }
  176.  
  177. reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
  178. reqStream.Close();
  179.  
  180. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  181. Encoding encoding = GetResponseEncoding(rsp);
  182. return GetResponseAsString(rsp, encoding);
  183. }
  184.  
  185. /// <summary>
  186. /// 执行带body体的POST请求。
  187. /// </summary>
  188. /// <param name="url">请求地址,含URL参数</param>
  189. /// <param name="body">请求body体字节流</param>
  190. /// <param name="contentType">body内容类型</param>
  191. /// <param name="headerParams">请求头部参数</param>
  192. /// <returns>HTTP响应</returns>
  193. public string DoPost(string url, byte[] body, string contentType, IDictionary<string, string> headerParams)
  194. {
  195. HttpWebRequest req = GetWebRequest(url, "POST", headerParams);
  196. req.ContentType = contentType;
  197. if (body != null)
  198. {
  199. System.IO.Stream reqStream = req.GetRequestStream();
  200. reqStream.Write(body, 0, body.Length);
  201. reqStream.Close();
  202. }
  203. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  204. Encoding encoding = GetResponseEncoding(rsp);
  205. return GetResponseAsString(rsp, encoding);
  206. }
  207.  
  208. public HttpWebRequest GetWebRequest(string url, string method, IDictionary<string, string> headerParams)
  209. {
  210. HttpWebRequest req = null;
  211. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  212. {
  213. if (this._ignoreSSLCheck)
  214. {
  215. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(TrustAllValidationCallback);
  216. }
  217. req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
  218. }
  219. else
  220. {
  221. req = (HttpWebRequest)WebRequest.Create(url);
  222. }
  223.  
  224. if (this._disableWebProxy)
  225. {
  226. req.Proxy = null;
  227. }
  228.  
  229. if (headerParams != null && headerParams.Count > 0)
  230. {
  231. foreach (string key in headerParams.Keys)
  232. {
  233. req.Headers.Add(key, headerParams[key]);
  234. }
  235. }
  236.  
  237. req.ServicePoint.Expect100Continue = false;
  238. req.Method = method;
  239. req.KeepAlive = true;
  240. req.UserAgent = "top-sdk-net";
  241. req.Accept = "text/xml,text/javascript";
  242. req.Timeout = this._timeout;
  243. req.ReadWriteTimeout = this._readWriteTimeout;
  244.  
  245. return req;
  246. }
  247.  
  248. /// <summary>
  249. /// 把响应流转换为文本。
  250. /// </summary>
  251. /// <param name="rsp">响应流对象</param>
  252. /// <param name="encoding">编码方式</param>
  253. /// <returns>响应文本</returns>
  254. public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
  255. {
  256. Stream stream = null;
  257. StreamReader reader = null;
  258.  
  259. try
  260. {
  261. // 以字符流的方式读取HTTP响应
  262. stream = rsp.GetResponseStream();
  263. if (Constants.CONTENT_ENCODING_GZIP.Equals(rsp.ContentEncoding, StringComparison.OrdinalIgnoreCase))
  264. {
  265. stream = new GZipStream(stream, CompressionMode.Decompress);
  266. }
  267. reader = new StreamReader(stream, encoding);
  268. return reader.ReadToEnd();
  269. }
  270. finally
  271. {
  272. // 释放资源
  273. if (reader != null) reader.Close();
  274. if (stream != null) stream.Close();
  275. if (rsp != null) rsp.Close();
  276. }
  277. }
  278.  
  279. /// <summary>
  280. /// 组装含参数的请求URL。
  281. /// </summary>
  282. /// <param name="url">请求地址</param>
  283. /// <param name="parameters">请求参数映射</param>
  284. /// <returns>带参数的请求URL</returns>
  285. public static string BuildRequestUrl(string url, IDictionary<string, string> parameters)
  286. {
  287. if (parameters != null && parameters.Count > 0)
  288. {
  289. return BuildRequestUrl(url, BuildQuery(parameters));
  290. }
  291. return url;
  292. }
  293.  
  294. /// <summary>
  295. /// 组装含参数的请求URL。
  296. /// </summary>
  297. /// <param name="url">请求地址</param>
  298. /// <param name="queries">一个或多个经过URL编码后的请求参数串</param>
  299. /// <returns>带参数的请求URL</returns>
  300. public static string BuildRequestUrl(string url, params string[] queries)
  301. {
  302. if (queries == null || queries.Length == 0)
  303. {
  304. return url;
  305. }
  306.  
  307. StringBuilder newUrl = new StringBuilder(url);
  308. bool hasQuery = url.Contains("?");
  309. bool hasPrepend = url.EndsWith("?") || url.EndsWith("&");
  310.  
  311. foreach (string query in queries)
  312. {
  313. if (!string.IsNullOrEmpty(query))
  314. {
  315. if (!hasPrepend)
  316. {
  317. if (hasQuery)
  318. {
  319. newUrl.Append("&");
  320. }
  321. else
  322. {
  323. newUrl.Append("?");
  324. hasQuery = true;
  325. }
  326. }
  327. newUrl.Append(query);
  328. hasPrepend = false;
  329. }
  330. }
  331. return newUrl.ToString();
  332. }
  333.  
  334. /// <summary>
  335. /// 组装普通文本请求参数。
  336. /// </summary>
  337. /// <param name="parameters">Key-Value形式请求参数字典</param>
  338. /// <returns>URL编码后的请求数据</returns>
  339. public static string BuildQuery(IDictionary<string, string> parameters)
  340. {
  341. if (parameters == null || parameters.Count == 0)
  342. {
  343. return null;
  344. }
  345.  
  346. StringBuilder query = new StringBuilder();
  347. bool hasParam = false;
  348.  
  349. foreach (KeyValuePair<string, string> kv in parameters)
  350. {
  351. string name = kv.Key;
  352. string value = kv.Value;
  353. // 忽略参数名或参数值为空的参数
  354. if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
  355. {
  356. if (hasParam)
  357. {
  358. query.Append("&");
  359. }
  360.  
  361. query.Append(name);
  362. query.Append("=");
  363. query.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
  364. hasParam = true;
  365. }
  366. }
  367.  
  368. return query.ToString();
  369. }
  370.  
  371. private Encoding GetResponseEncoding(HttpWebResponse rsp)
  372. {
  373. string charset = rsp.CharacterSet;
  374. if (string.IsNullOrEmpty(charset))
  375. {
  376. charset = Constants.CHARSET_UTF8;
  377. }
  378. return Encoding.GetEncoding(charset);
  379. }
  380.  
  381. private static bool TrustAllValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  382. {
  383. return true; // 忽略SSL证书检查
  384. }
  385. }
  386.  
  387. public class Constants
  388. {
  389. public const string CONTENT_ENCODING_GZIP = "gzip";
  390. public const string CHARSET_UTF8 = "utf-8";
  391. public const string CTYPE_DEFAULT = "application/octet-stream";
  392. public const int READ_BUFFER_SIZE = 1024 * 4;
  393. }
  394.  
  395. /// <summary>
  396. /// 文件元数据。
  397. /// 可以使用以下几种构造方法:
  398. /// 本地路径:new FileItem("C:/temp.jpg");
  399. /// 本地文件:new FileItem(new FileInfo("C:/temp.jpg"));
  400. /// 字节数组:new FileItem("abc.jpg", bytes);
  401. /// 输入流:new FileItem("abc.jpg", stream);
  402. /// </summary>
  403. public class FileItem
  404. {
  405. private Contract contract;
  406.  
  407. /// <summary>
  408. /// 基于本地文件的构造器。
  409. /// </summary>
  410. /// <param name="fileInfo">本地文件</param>
  411. public FileItem(FileInfo fileInfo)
  412. {
  413. this.contract = new LocalContract(fileInfo);
  414. }
  415.  
  416. /// <summary>
  417. /// 基于本地文件全路径的构造器。
  418. /// </summary>
  419. /// <param name="filePath">本地文件全路径</param>
  420. public FileItem(string filePath)
  421. : this(new FileInfo(filePath))
  422. {
  423. }
  424.  
  425. /// <summary>
  426. /// 基于文件名和字节数组的构造器。
  427. /// </summary>
  428. /// <param name="fileName">文件名称(服务端持久化字节数组到磁盘时的文件名)</param>
  429. /// <param name="content">文件字节数组</param>
  430. public FileItem(string fileName, byte[] content)
  431. : this(fileName, content, null)
  432. {
  433. }
  434.  
  435. /// <summary>
  436. /// 基于文件名、字节数组和媒体类型的构造器。
  437. /// </summary>
  438. /// <param name="fileName">文件名(服务端持久化字节数组到磁盘时的文件名)</param>
  439. /// <param name="content">文件字字节数组</param>
  440. /// <param name="mimeType">媒体类型</param>
  441. public FileItem(string fileName, byte[] content, string mimeType)
  442. {
  443. this.contract = new ByteArrayContract(fileName, content, mimeType);
  444. }
  445.  
  446. /// <summary>
  447. /// 基于文件名和输入流的构造器。
  448. /// </summary>
  449. /// <param name="fileName">文件名称(服务端持久化输入流到磁盘时的文件名)</param>
  450. /// <param name="content">文件输入流</param>
  451. public FileItem(string fileName, Stream stream)
  452. : this(fileName, stream, null)
  453. {
  454. }
  455.  
  456. /// <summary>
  457. /// 基于文件名、输入流和媒体类型的构造器。
  458. /// </summary>
  459. /// <param name="fileName">文件名(服务端持久化输入流到磁盘时的文件名)</param>
  460. /// <param name="content">文件输入流</param>
  461. /// <param name="mimeType">媒体类型</param>
  462. public FileItem(string fileName, Stream stream, string mimeType)
  463. {
  464. this.contract = new StreamContract(fileName, stream, mimeType);
  465. }
  466.  
  467. public bool IsValid()
  468. {
  469. return this.contract.IsValid();
  470. }
  471.  
  472. public long GetFileLength()
  473. {
  474. return this.contract.GetFileLength();
  475. }
  476.  
  477. public string GetFileName()
  478. {
  479. return this.contract.GetFileName();
  480. }
  481.  
  482. public string GetMimeType()
  483. {
  484. return this.contract.GetMimeType();
  485. }
  486.  
  487. public void Write(Stream output)
  488. {
  489. this.contract.Write(output);
  490. }
  491. }
  492.  
  493. internal interface Contract
  494. {
  495. bool IsValid();
  496. string GetFileName();
  497. string GetMimeType();
  498. long GetFileLength();
  499. void Write(Stream output);
  500. }
  501.  
  502. internal class LocalContract : Contract
  503. {
  504. private FileInfo fileInfo;
  505.  
  506. public LocalContract(FileInfo fileInfo)
  507. {
  508. this.fileInfo = fileInfo;
  509. }
  510.  
  511. public long GetFileLength()
  512. {
  513. return this.fileInfo.Length;
  514. }
  515.  
  516. public string GetFileName()
  517. {
  518. return this.fileInfo.Name;
  519. }
  520.  
  521. public string GetMimeType()
  522. {
  523. return Constants.CTYPE_DEFAULT;
  524. }
  525.  
  526. public bool IsValid()
  527. {
  528. return this.fileInfo != null && this.fileInfo.Exists;
  529. }
  530.  
  531. public void Write(Stream output)
  532. {
  533. using (BufferedStream bfs = new BufferedStream(this.fileInfo.OpenRead()))
  534. {
  535. int n = 0;
  536. byte[] buffer = new byte[Constants.READ_BUFFER_SIZE];
  537. while ((n = bfs.Read(buffer, 0, buffer.Length)) > 0)
  538. {
  539. output.Write(buffer, 0, n);
  540. }
  541. }
  542. }
  543. }
  544.  
  545. internal class ByteArrayContract : Contract
  546. {
  547. private string fileName;
  548. private byte[] content;
  549. private string mimeType;
  550.  
  551. public ByteArrayContract(string fileName, byte[] content, string mimeType)
  552. {
  553. this.fileName = fileName;
  554. this.content = content;
  555. this.mimeType = mimeType;
  556. }
  557.  
  558. public bool IsValid()
  559. {
  560. return this.content != null && this.fileName != null;
  561. }
  562.  
  563. public long GetFileLength()
  564. {
  565. return this.content.Length;
  566. }
  567.  
  568. public string GetFileName()
  569. {
  570. return this.fileName;
  571. }
  572.  
  573. public string GetMimeType()
  574. {
  575. if (string.IsNullOrEmpty(this.mimeType))
  576. {
  577. return Constants.CTYPE_DEFAULT;
  578. }
  579. else
  580. {
  581. return this.mimeType;
  582. }
  583. }
  584.  
  585. public void Write(Stream output)
  586. {
  587. output.Write(this.content, 0, this.content.Length);
  588. }
  589. }
  590.  
  591. internal class StreamContract : Contract
  592. {
  593. private string fileName;
  594. private Stream stream;
  595. private string mimeType;
  596.  
  597. public StreamContract(string fileName, Stream stream, string mimeType)
  598. {
  599. this.fileName = fileName;
  600. this.stream = stream;
  601. this.mimeType = mimeType;
  602. }
  603.  
  604. public long GetFileLength()
  605. {
  606. return 0L;
  607. }
  608.  
  609. public string GetFileName()
  610. {
  611. return this.fileName;
  612. }
  613.  
  614. public string GetMimeType()
  615. {
  616. if (string.IsNullOrEmpty(mimeType))
  617. {
  618. return Constants.CTYPE_DEFAULT;
  619. }
  620. else
  621. {
  622. return this.mimeType;
  623. }
  624. }
  625.  
  626. public bool IsValid()
  627. {
  628. return this.stream != null && this.fileName != null;
  629. }
  630.  
  631. public void Write(Stream output)
  632. {
  633. using (this.stream)
  634. {
  635. int n = 0;
  636. byte[] buffer = new byte[Constants.READ_BUFFER_SIZE];
  637. while ((n = this.stream.Read(buffer, 0, buffer.Length)) > 0)
  638. {
  639. output.Write(buffer, 0, n);
  640. }
  641. }
  642. }
  643. }
  644. }

  

一个比较强大的HTTP请求类,支持文本参数和文件参数。的更多相关文章

  1. C# 一个特别不错的http请求类

    using System; using System.Collections; using System.Collections.Generic; using System.Collections.S ...

  2. Afreechart很强大的图表库,支持股票曲线图,饼图,曲线

    Afreechart是一个很强大的图表库,支持股票曲线图,饼图,曲线等.源码下载:http://www.23code.com/afreechart/

  3. 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

    目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...

  4. 基于Volley,Gson封装支持JWT无状态安全验证和数据防篡改的GsonRequest网络请求类

    这段时间做新的Android项目的client和和REST API通讯框架架构设计.使用了非常多新技术,终于的方案也相当简洁优雅.client仅仅须要传Java对象,server端返回json字符串, ...

  5. 一个高性能的对象属性复制类,支持不同类型对象间复制,支持Nullable<T>类型属性

    由于在实际应用中,需要对大量的对象属性进行复制,原来的方法是通过反射实现,在量大了以后,反射的性能问题就凸显出来了,必须用Emit来实现. 搜了一圈代码,没发现适合的,要么只能在相同类型对象间复制,要 ...

  6. block传值以及利用block封装一个网络请求类

    1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...

  7. HttpUtil工具类,发送Get/Post请求,支持Http和Https协议

    HttpUtil工具类,发送Get/Post请求,支持Http和Https协议 使用用Httpclient封装的HttpUtil工具类,发送Get/Post请求 1. maven引入httpclien ...

  8. AndroidInject项目使用动态代理增加对网络请求的支持

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3540427.html AndroidInject项目是我写的一 ...

  9. Servlet(五):一个Servlet处理多个请求

    一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...

随机推荐

  1. Linux服务器上如何设置MySQL的max_allowed_packe

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败. 查看目前配置  show VARIABLES like ...

  2. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法

    java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法 错误描述:java.lang.NoClassDefFoundErro ...

  3. 无脑无负担网站架构-- Application Request Route的一些应用

    首先作为一个.net 程序员,多数情况你懒的整什么架构啊.框架啊.还有那命令行的linux,别说linux也有桌面,那个桌面用起来更让人抓狂,一直不明白居然有人说喜欢上linux的命令行,装B还是SB ...

  4. Mysal表类型的区别-MyISAM,InnoDB

    1/ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.I ...

  5. jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  6. 寻找最大的K个数(上)

    这是一道很经典的题目,有太多方法了,今天写了两种方法,分别是快排和堆排序 #include <iostream> using namespace std; #define N 25 //初 ...

  7. nancyfx的安装笔记

    这个安装时很简单的 只要 Install-Package Nancy.Hosting.Aspnet 就行了. 需要注意的是,千万不要用那个模板安装,通过创建nancyfx类型项目的方式安装是有问题的. ...

  8. linux 流量统计

    因为很多vps或者服务器都是限流量的,但是又很多服务商并没有提供详细的流量表,比如每天的流量表,所以肯定有人很想知道自己服务器到底跑了多少流量. vnstat就是一个很好用的服务器流量统计命令.我截几 ...

  9. css transition & animation

    transition 支持:IE10+ img{ transition: 1s 1s height ease; } transition-property: 属性transition-duration ...

  10. Solr 使用自定义 Query Parser(短语查询,精准查询)

    原文出处:http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html 由于 Solr 默认的 Query Parser 生成的 Q ...