HttpWebRequest 模拟登录响应点击事件(分享自己用的HttpHelper类)
平时也经常采集网站数据,也做模拟登录,但一般都是html控件POST到页面登录;还没有遇到用户服务器控件button按钮点击事件登录的,今天像往常一样POST传递参数,但怎么都能登录不了;最后发现还有两个参数需要传,__EVENTVALIDATION和__VIEWSTATE
在传的过程中需要对参数值进行URL编码
System.Web.HttpUtility.UrlEncode(value)
模拟登录代码:在本地写的一个测试的网站来模拟登录,原理都一样:
Request request = new Request();
request.Method = Method.POST;
request.Add("UserName", "");
request.Add("PassWord", "");
request.Add("btnLogin", "Button");
HtmlHelper html = new HtmlHelper();
Response response = html.GetHTML("http://localhost:64554/Lgoin.aspx");
Match math = Regex.Match(response.Html, "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"(?<val>.*?)\" />", RegexOptions.Singleline | RegexOptions.IgnoreCase);
string value = math.Groups["val"].Value;
request.Add("__VIEWSTATE", System.Web.HttpUtility.UrlEncode(value));
math = Regex.Match(response.Html, "<input type=\"hidden\" name=\"__EVENTVALIDATION\" id=\"__EVENTVALIDATION\" value=\"(?<val>.*?)\" />", RegexOptions.Singleline | RegexOptions.IgnoreCase);
request.Add("__EVENTVALIDATION", System.Web.HttpUtility.UrlEncode(math.Groups["val"].Value));
response = html.GetHTML("http://localhost:64554/Lgoin.aspx", true, request);
这里发布哈,我平时用的HttpHelper类
#region 发送方式
public enum Method
{
GET, POST
}
#endregion #region 返回内容
/// <summary>
/// 返回内容
/// </summary>
public class Response
{
#region 远程服务器时间
DateTime _RemoteDateTime = Convert.ToDateTime("1900-01-01 00:00:00.000");
/// <summary>
/// 远程服务器时间
/// </summary>
public DateTime RemoteDateTime
{
get { return _RemoteDateTime; }
set { _RemoteDateTime = value; }
}
#endregion #region 返回内容
string html = string.Empty;
/// <summary>
/// 返回内容
/// </summary>
public string Html
{
get { return html; }
set { html = value; }
}
#endregion #region 返回的Cookies
CookieContainer _Cookies = new CookieContainer();
/// <summary>
/// 返回的Cookies
/// </summary>
public CookieContainer Cookies
{
get { return _Cookies; }
set { _Cookies = value; }
}
#endregion #region HTTP状态代码
/// <summary>
/// HTTP状态代码
/// </summary>
public HttpStatusCode StatusCode { get; set; }
#endregion #region 返回的图片内容
Image _Image = null;
/// <summary>
/// 返回的图片内容
/// </summary>
public Image Image
{
get { return _Image; }
set { _Image = value; }
}
#endregion #region 当前URL
string _Url = string.Empty;
/// <summary>
/// 当前URL
/// </summary>
public string Url
{
get { return _Url; }
set { _Url = value; }
}
#endregion
}
#endregion #region 发送数据
/// <summary>
/// 发送数据
/// </summary>
[Serializable]
public class Request
{
List<KeyValuePair<string, string>> sList = new List<KeyValuePair<string, string>>();
Method _sendMethod = Method.GET;
public Method Method
{
get { return _sendMethod; }
set { _sendMethod = value; }
} private CookieContainer _Cookies = new CookieContainer();
public CookieContainer Cookies
{
get { return this._Cookies; }
set { this._Cookies = value; }
}
public void Clear()
{
this.sList.Clear();
}
public void Add(string key, string value)
{
this.sList.Add(new KeyValuePair<string, string>(key, value));
}
public void Update(string key, string value)
{
int index = -;
for (int i = ; i < this.List.Count; i++)
{
if (this.List[i].Key.Equals(key))
{
index = i;
break;
}
} if (index > ) this.List.RemoveAt(index); this.List.Add(new KeyValuePair<string, string>(key, value));
}
public override string ToString()
{
string sRet = string.Empty; foreach (KeyValuePair<string,string> val in this.sList)
{
if (sRet.Length == )
sRet = string.Format("{0}={1}", val.Key, val.Value);
else
sRet = string.Format("{0}&{1}={2}", sRet, val.Key, val.Value);
} return sRet;
} public byte[] ToBytes()
{
return Encoding.ASCII.GetBytes(this.ToString());
} public List<KeyValuePair<string,string>> List
{
set
{
this.sList = value;
}
get
{
return this.sList;
}
} public string Find(string key)
{
string sRet = string.Empty; KeyValuePair<string, string> val = this.List.Find(delegate(KeyValuePair<string, string> k) { return k.Key.Equals(key); }); sRet = val.Value; return sRet;
} }
#endregion public class HtmlHelper
{
public static HtmlHelper Init()
{
return new HtmlHelper();
} #region Cookies
CookieContainer _Cookies = new CookieContainer();
/// <summary>
/// Cookies
/// </summary>
public CookieContainer Cookies
{
get { return _Cookies; }
set { _Cookies = value; }
}
#endregion #region 连接远程服务器超时触发事件
public delegate void Connection_TimeOut_Handle(string sUrl, Request request, Exception ex);
/// <summary>
/// 连接远程服务器超时触发事件
/// </summary>
public event Connection_TimeOut_Handle Connection_TimeOut;
#endregion #region 获取数据完毕触发事件
public delegate void Connection_Complete_Handle(Response response);
/// <summary>
/// 获取数据完毕触发事件
/// </summary>
public event Connection_Complete_Handle Connection_Complete;
#endregion #region 设置发送头信息
/// <summary>
/// 设置发送头信息
/// </summary>
/// <param name="request"></param>
private void SetRequestHeader(ref HttpWebRequest request, string referer)
{
request.Timeout = ;
request.Accept = "*/*";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 2.0.50727;)";
request.Headers["Accept-Encoding"] = "gzip, deflate";
request.Headers["Accept-Language"] = "zh-cn";
request.Headers["Accept-Charset"] = "utf-8;q=0.7,*;q=0.7";
request.ContentType = "application/x-www-form-urlencoded";
request.Referer = referer;
request.KeepAlive = true;
}
#endregion #region 解压经过Gzip压缩的流
/// <summary>
/// 解压经过Gzip压缩的流
/// </summary>
/// <param name="contentEncoding">流编码</param>
/// <param name="resonseStream">网页返回的流内容</param>
/// <returns></returns>
private string GzipStreame(string ecoding, Stream resonseStream)
{
return GzipStreame(ecoding, resonseStream, Encoding.UTF8);
}
private string GzipStreame(string ecoding, Stream resonseStream, Encoding coding)
{
string html = string.Empty;
if (ecoding.ToLower().IndexOf("gzip") != -)
{
html = new StreamReader(new GZipStream(resonseStream, CompressionMode.Decompress), coding).ReadToEnd();
}
else if (ecoding.ToLower().IndexOf("deflate") >= )
{
html = new StreamReader(new DeflateStream(resonseStream, CompressionMode.Decompress), coding).ReadToEnd();
}
else
{
html = new StreamReader(resonseStream, coding).ReadToEnd();
}
return html;
} #endregion #region 获取远程HTML
/// <summary>
/// 获取远程HTML
/// </summary>
/// <param name="url">地址</param>
/// <returns></returns>
public Response GetHTML(string url)
{
return GetHTML(url, false, new Request(), new Uri(url).Host, Encoding.UTF8, null);
}
public Response GetHTML(string url, WebProxy proxy)
{
return GetHTML(url, false, new Request(), new Uri(url).Host, Encoding.UTF8, proxy);
}
public Response GetHTML(string url, Encoding coding)
{
return GetHTML(url, false, new Request(), new Uri(url).Host, coding, null);
}
public Response GetHTML(string url, Encoding coding, WebProxy proxy)
{
return GetHTML(url, false, new Request(), new Uri(url).Host, coding, proxy);
}
/// <summary>
/// 获取远程HTML
/// </summary>
/// <param name="url">地址</param>
/// <param name="send">是否自动重定向URL</param>
/// <returns></returns>
public Response GetHTML(string url, bool bAllowAutoRedirect)
{
return GetHTML(url, bAllowAutoRedirect, new Request() { }, new Uri(url).Host, Encoding.UTF8, null);
}
public Response GetHTML(string url, bool bAllowAutoRedirect, WebProxy porxy)
{
return GetHTML(url, bAllowAutoRedirect, new Request() { }, new Uri(url).Host, Encoding.UTF8, porxy);
}
/// <summary>
/// 获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public Response GetHTML(string url, Request request)
{
return GetHTML(url, request, Encoding.UTF8);
}
public Response GetHTML(string url, Request request, WebProxy porxy)
{
return GetHTML(url, false, request, new Uri(url).Host, Encoding.UTF8, porxy);
}
public Response GetHTML(string url, bool bAllowAutoRedirect, Request request)
{
return GetHTML(url, bAllowAutoRedirect, request, new Uri(url).Host, Encoding.UTF8, null);
}
public Response GetHTML(string url, bool bAllowAutoRedirect, Request request, WebProxy proxy)
{
return GetHTML(url, bAllowAutoRedirect, request, new Uri(url).Host, Encoding.UTF8, proxy);
}
public Response GetHTML(string url, Request request, Encoding coding)
{
return GetHTML(url, false, request, new Uri(url).Host, coding, null);
}
public Response GetHTML(string url, Request request, Encoding coding, WebProxy proxy)
{
return GetHTML(url, false, request, new Uri(url).Host, coding, proxy);
}
/// <summary>
/// 获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <param name="bAllowAutoRedirect">是否自动跳转</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public Response GetHTML(string sUrl, bool bAllowAutoRedirect, Request request, string referer)
{
return GetHTML(sUrl, bAllowAutoRedirect, request, referer, Encoding.UTF8, null);
}
public Response GetHTML(string sUrl, bool bAllowAutoRedirect, Request request, string referer, WebProxy proxy)
{
return GetHTML(sUrl, bAllowAutoRedirect, request, referer, Encoding.UTF8, proxy);
}
/// <summary>
/// 获取HTML页面内容
/// </summary>
/// <param name="url">地址</param>
/// <param name="bAllowAutoRedirect">是否自动跳转</param>
/// <param name="request">查询信息</param>
/// <param name="referer">引用页</param>
/// <param name="coding">编码格式</param>
/// <returns></returns>
public Response GetHTML(string url, bool bAllowAutoRedirect, Request request, string referer, Encoding coding, WebProxy proxy)
{
Response result = new Response(); if (request.Method == Method.GET)
{
string sData = request.ToString();
if (sData.Length > ) url = string.Format("{0}?{1}", url, sData);
} HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
if (proxy != null) httpRequest.Proxy = proxy; #region SSL方式
if (url.Contains("https://"))
{
//这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
//创建证书文件
X509Certificate objx509 = new X509Certificate(); //添加到请求里
httpRequest.ClientCertificates.Add(objx509);
}
#endregion // 设置发送头信息
if (referer.Length == )
SetRequestHeader(ref httpRequest, new Uri(url).Host);
else
SetRequestHeader(ref httpRequest, referer);
// 自动重定向
httpRequest.AllowAutoRedirect = bAllowAutoRedirect;
httpRequest.Timeout = * ;
// 关联Cookies
//if (httpRequest.CookieContainer == null)
// httpRequest.CookieContainer = new CookieContainer();
httpRequest.CookieContainer = this.Cookies; try
{ if (request.Method == Method.POST)
{
// 设置发送方式
httpRequest.Method = request.Method.ToString();
// 获取发送数据流
//HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse; Stream strem = httpRequest.GetRequestStream(); // 写入发送数据
byte[] bs = request.ToBytes();
strem.Write(bs, , bs.Length);
strem.Close();
} HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse; Stream responseStream = httpResponse.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, coding); //result.Html = sr.ReadToEnd();
result.Html = System.Web.HttpUtility.HtmlDecode(GzipStreame(httpResponse.ContentEncoding, responseStream, coding));
result.RemoteDateTime = Convert.ToDateTime(httpResponse.GetResponseHeader("Date")); result.Url = httpResponse.ResponseUri.OriginalString; this.Cookies.Add(httpResponse.Cookies); result.Cookies = this.Cookies; result.StatusCode = httpResponse.StatusCode; responseStream.Dispose(); if (this.Connection_Complete != null)
this.Connection_Complete.Invoke(result);
}
catch (Exception ex)
{
if (this.Connection_TimeOut != null)
this.Connection_TimeOut.Invoke(url, request, ex);
}
return result;
} private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
} #endregion #region 获取远程图片
public Response GetImage(string sUrl)
{
return GetImage(sUrl, false, new Request());
}
public Response GetImage(string sUrl, WebProxy proxy)
{
return GetImage(sUrl, false, new Request(), proxy);
}
public Response GetImage(string sUrl, string referer)
{
return GetImage(sUrl, false, referer, null);
}
public Response GetImage(string sUrl, string referer, WebProxy proxy)
{
return GetImage(sUrl, false, referer, proxy);
}
public Response GetImage(string sUrl, bool bAllowAutoRedirect, string referer)
{
return GetImage(sUrl, bAllowAutoRedirect, new Request(), referer, null);
}
public Response GetImage(string sUrl, bool bAllowAutoRedirect, string referer, WebProxy proxy)
{
return GetImage(sUrl, bAllowAutoRedirect, new Request(), referer, null);
}
//public Image GetImage(string sUrl, bool bAllowAutoRedirect, Request request)
//{
// return GetImage(sUrl, bAllowAutoRedirect, request, new CookieContainer(), "");
////}
//public Image GetImage(string sUrl, bool bAllowAutoRedirect, Request request, string referer)
//{
// return GetImage(sUrl, bAllowAutoRedirect, request,referer);
//}
/// <summary>
/// 获取远程图片
/// </summary>
/// <param name="sUrl">图片地址</param>
/// <param name="bAllowAutoRedirect">是否自动跳转</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public Response GetImage(string sUrl, bool bAllowAutoRedirect, Request request)
{
return GetImage(sUrl, bAllowAutoRedirect, request, "", null);
}
public Response GetImage(string sUrl, bool bAllowAutoRedirect, Request request, string referer)
{
return GetImage(sUrl, bAllowAutoRedirect, request, referer, null);
}
public Response GetImage(string sUrl, bool bAllowAutoRedirect, Request request, WebProxy proxy)
{
return GetImage(sUrl, bAllowAutoRedirect, request, "", proxy);
}
/// <summary>
/// 获取远程图片
/// </summary>
/// <param name="sUrl">图片地址</param>
/// <param name="bAllowAutoRedirect">是否自动跳转</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public Response GetImage(string url, bool bAllowAutoRedirect, Request request, string referer, WebProxy proxy)
{
Response response = new Response(); if (request.Method == Method.GET)
{
string sData = request.ToString();
if (sData.Length > ) url = string.Format("{0}?{1}", url, sData);
} HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
if (proxy != null) httpRequest.Proxy = proxy; #region SSL方式
if (url.Contains("https://"))
{
//这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
//创建证书文件
X509Certificate objx509 = new X509Certificate(); //添加到请求里
httpRequest.ClientCertificates.Add(objx509);
}
#endregion // 设置发送头信息
if (referer.Length == )
SetRequestHeader(ref httpRequest, new Uri(url).Host);
else
SetRequestHeader(ref httpRequest, referer); // 自动重定向
httpRequest.AllowAutoRedirect = bAllowAutoRedirect;
// 关联Cookies
httpRequest.CookieContainer = this.Cookies; try
{ if (request.Method == Method.POST)
{
// 设置发送方式
httpRequest.Method = request.Method.ToString();
// 获取发送数据流
//HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse; Stream strem = httpRequest.GetRequestStream(); // 写入发送数据
byte[] bs = request.ToBytes();
strem.Write(bs, , bs.Length);
strem.Close();
} HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse; Stream responseStream = httpResponse.GetResponseStream(); //if (responseStream.CanSeek)
//{
response.Image = Image.FromStream(responseStream);
//}
//else
//{
// response.Image = null;
//}
response.RemoteDateTime = Convert.ToDateTime(httpResponse.GetResponseHeader("Date")); this.Cookies.Add(httpResponse.Cookies);
response.Cookies = this.Cookies;
response.StatusCode = httpResponse.StatusCode;
responseStream.Dispose();
responseStream.Close();
}
catch (Exception ex)
{
if (this.Connection_TimeOut != null)
this.Connection_TimeOut.Invoke(url, request, ex);
} return response;
}
#endregion #region 异步获取远程HTML
/// <summary>
/// 异步获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <returns></returns>
public void BeginGetHTML(string sUrl)
{
BeginGetHTML(sUrl, false, new Request() { });
}
/// <summary>
/// 异步获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <param name="send">是否自动重定向URL</param>
/// <returns></returns>
public void BeginGetHTML(string sUrl, bool bAllowAutoRedirect)
{
BeginGetHTML(sUrl, bAllowAutoRedirect, new Request() { });
}
/// <summary>
/// 异步获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public void BeginGetHTML(string sUrl, Request request)
{
BeginGetHTML(sUrl, false, request);
}
/// <summary>
/// 异步获取远程HTML
/// </summary>
/// <param name="sUrl">地址</param>
/// <param name="bAllowAutoRedirect">是否自动跳转</param>
/// <param name="send">发送内容</param>
/// <returns></returns>
public void BeginGetHTML(string sUrl, bool bAllowAutoRedirect, Request request)
{
Response result = new Response(); if (request.Method == Method.GET)
{
string sData = request.ToString();
if (sData.Length > ) sUrl = string.Format("{0}?{1}", sUrl, sData);
} HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(sUrl);
// 设置发送头信息
SetRequestHeader(ref httpRequest, new Uri(sUrl).Host);
// 自动重定向
httpRequest.AllowAutoRedirect = bAllowAutoRedirect; if (request.Method == Method.POST)
{
// 设置发送方式
httpRequest.Method = request.Method.ToString(); // 获取发送数据流
Stream stream = httpRequest.GetRequestStream(); byte[] bs = request.ToBytes();
stream.Write(bs, , bs.Length);
stream.Close();
//httpRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback),httpRequest);
// 写入发送数据 } //HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse; AsyncCallback callback = new AsyncCallback(GetResponseStreamCallback);
try
{
httpRequest.BeginGetResponse(callback, httpRequest);
}
catch (WebException ex)
{
if (this.Connection_TimeOut != null)
this.Connection_TimeOut.Invoke(sUrl, request, ex);
}
} private void GetRequestStreamCallback(IAsyncResult ar)
{
//Request request = ar.AsyncState as Request;
//Stream stream = async.EndGetRequestStream(ar); //byte[] bs = request.ToBytes();
//stream.Write(bs, 0, bs.Length);
//stream.Close();
} private void GetResponseStreamCallback(IAsyncResult ar)
{
HttpWebRequest httpRequest = ar.AsyncState as HttpWebRequest;
HttpWebResponse httpResponse = httpRequest.EndGetResponse(ar) as HttpWebResponse; Stream responseStream = httpResponse.GetResponseStream(); Response response = new Response(); response.Html = GzipStreame(httpResponse.ContentEncoding, responseStream);
response.RemoteDateTime = Convert.ToDateTime(httpResponse.GetResponseHeader("Date"));
//response.Cookies = httpResponse.Cookies; if (this.Connection_Complete != null)
this.Connection_Complete.Invoke(response);
}
#endregion
}
HttpWebRequest 模拟登录响应点击事件(分享自己用的HttpHelper类)的更多相关文章
- UIButton无法响应点击事件
一.问题描述 因为项目需要,需要UITableView上添加固定的筛选表头,一直固定,不能随UITableView滚动.所以直接将表头与UITableView分离,将它添加到控制器的UIView上,即 ...
- 设置TextView下划线并响应点击事件(SpannableString)
下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) fi ...
- 隐藏自定义的tabbar之后,push到B视图,B视图的键盘工具条无法响应点击事件
我的情况如下: 在TabbarViewController中隐藏了系统的tabbar,然后自定义tabbar,A B C D 4个视图都有UINavigationController,A视图 使用的是 ...
- iOS开发-UIImageView响应点击事件
UIImageView是不能够响应点击事件的,在开发过程中我们需要经常对头像等添加点击事件,上网搜索一番后发现有如下两个方法: 1.找到点击图片Event,添加事件处理函数 UIImageView.u ...
- c# 给button添加不规则的图片以及用pictureBox替代button响应点击事件
1.Flat button 用这个方法,前提是要把button的type设置为Flat button1.TabStop = false;button1.FlatAppearance.BorderSiz ...
- TextView下划线,部分文字并响应点击事件(SpannableString)
TextView useInfo = (TextView) findViewById(R.id.info); useInfo.setText("开始即表示您同意遵守"); Stri ...
- Swift-ImageView响应点击事件
随着Swift语言的不断更新迭代,纯Swift语言编写的代码更加紧凑简单,结合StoryBorad的使用,使开发苹果APP的门槛降低了不少.个人也是比较推荐使用Interface Builder去生成 ...
- Android EditText中插入图片并响应点击事件
EditText中插入图片基本就是两种方法: ,通过Html.fromHtml(..)来实现 [mw_shl_code=java,true]eText.append(Html.fromHtml(&qu ...
- 【转】Android - Button(按钮)的响应点击事件的4种写法
原文网址:http://www.yrom.net/blog/2011/12/12/android-4-onclicklistener-of-button/ Button控件setOnclickList ...
随机推荐
- javascript两行代码按指定格式输出日期时间
javascript两行代码按指定格式输出日期时间,具体看代码: function date2str(x,y) { var z ={y:x.getFullYear(),M:x.getMonth()+1 ...
- 【持续更新】D3 的学习资料
经常有朋友问哪里有关于 D3 的比较好的学习资料,现整理成此文.以后找到更多更好的,会不断更新本文. 我是在2013年开始接触 D3 的,当时就觉得这个工具很好玩.至今,学习资料整理了不少.如果有朋友 ...
- JavaScript中定时器
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务. setTimeout() ...
- javascript六难题
1.下面代码的运行效果是什么?为什么? <html> <head> <meta charset="utf-8"> <title>DO ...
- 关于C#中static静态变量
C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静 ...
- 在Sql Server 查询分析器里使用事务
declare @updatecount int begin TRAN DECLARE @tbid INTSELECT @tbid=iMax FROM tbID WHERE strName='ipcc ...
- Zabbix探索:Zabbix API使用时的错误1
好久没来了,最近比较疲倦,估计是从年初到现在没有休息的原因. 刚刚批量导入网络设备到Zabbix时,报错: Cannot implode expression 后面自然是IP和触发器的表达式. 最初还 ...
- POJ 2955 Brackets 区间合并
输出一个串里面能匹配的括号数 状态转移方程: if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp ...
- Android实例-多窗口的切换(XE8+小米2)
1.图片一是程序运行后的界面. 2.图片二是点击"非模态显示"的界面. 3.图片三是点击"模诚显示"的界面(提示平台不支持). unit Unit1; inte ...
- SaltStack管理从这里开始
Modules 1:查看所有module列表: salt 'jcfx-4' sys.list_modules jcfx-4: - acl - aliases - alternatives - apac ...