post之前如何获得viewstate viewstate 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private string ExtractViewState(string s){ string viewStateNameDelimiter = "__VIEWSTATE"; string valueDelimiter = "value=\""; int viewStateNamePosition = s.IndexOf(viewStateNameDelimiter); int viewStateValuePosition = s.IndexOf( valueDelimiter, viewStateNamePosition ); int viewStateStartPosition = viewStateValuePosition + valueDelimiter.Length; int viewStateEndPosition = s.IndexOf("\"", viewStateStartPosition); return HttpUtility.UrlEncodeUnicode( s.Substring( viewStateStartPosition, viewStateEndPosition - viewStateStartPosition ) ); } 好吧,我错了。其实我是做Java的,要抓一个.NET网站。我只是来问问viewstate的原理,结果没说清楚,害的你白写了一段代码- - 好吧,我错了。其实我是做Java的,要抓一个.NET网站。我只是来问问viewstate的原理,结果没说清楚,害的你白写了一段代码- -明白了? 不是啊,我是要用Java写代码,你写了个C#代码对我- - 你直接用FF来查看__VIEWSTATE保存的是什么,照搬过去提交不就好了吗 这个网站的viewstate是根据数据的变化而变化的 获取viewstate的两个方法,第一个方法执行会调用第二个 private String[] fetchViewStateByUrl(String url) throws MessageException { BasicHttpGetProcessor httpGet = null; String content = ""; try { httpGet = new BasicHttpGetProcessor(getHttpclient() , url); HttpResponse response = httpGet.sendGet(); content = EntityUtils.toString(response.getEntity()); } catch(Exception e) { if(httpGet != null) { httpGet.cancel(); } e.printStackTrace(); throw new MessageException("抓取出现异常"); } finally { if(httpGet != null) { httpGet.close(); } } return fetchViewStateByHtml(content); } private String[] fetchViewStateByHtml(String html) throws MessageException { String[] result = new String[2]; try { Parser parser = Parser.createParser(html , "UTF-8"); NodeFilter filter = new NodeClassFilter(InputTag.class); NodeList nodeList =parser.extractAllNodesThatMatch(filter); InputTag inputTag1 = null; InputTag inputTag2 = null; for(int i = 0 ; i < nodeList.size() ; i++) { InputTag it = (InputTag)nodeList.elementAt(i); String name = it.getAttribute("name"); if("__VIEWSTATE".equals(name)) { inputTag1 = it; } if("__EVENTVALIDATION".equals(name)) { inputTag2 = it; } } if(inputTag1 != null) { result[0] = inputTag1.getAttribute("value"); } if(inputTag2 != null) { result[1] = inputTag2.getAttribute("value"); } } catch(Exception e) { e.printStackTrace(); throw new MessageException("抓取出现异常!"); } return result; }一般页面的viewstate,是post的url传入第一个方法,然后get请求url得到的content,最后parser出来的有一些页面的viewstate与get得到的viewstate不同,应该直接用第二个方法parser前一个页面运行之后的content,就能得到变化的viewstate。我的问题就是这样解决的,不知道还有其它情况没 要把 ViewState 通过数据库或其他持久化设备来维持,则需要采用特定的 LosFormatter 类来序列化,反序列化。(serialize, deserialize) ViewState Saved in Custom Store:protected override object LoadPageStateFromPersistenceMedium() { LosFormatter format = new LosFormatter(); return format.Deserialize(YourDataStore["ViewState"]);}protected override void SavePageStateToPersistenceMedium(object viewState) { LosFormatter format = new LosFormatter(); StringWriter writer = new StringWriter(); format.Serialize(writer, viewState); YourDataStore["ViewState"] = writer.ToString();}看一下 ViewState 的内部格式到底是什么。每个控件的 ViewState 保存在一个三元组中(Triplet, System.Web.UI.Triplet).其 First 对象是: 一个 Pair(System.Web.UI.Pair) 或 Array or Pairs, of ArrayLists of related name-values.Second 对象: 该控件在控件树中的索引的 ArrayListThird 对象: 子控件的类似的三元组的 ArrayList 急!!!!! 请教条SQL语句 JS文件引用也分先后吗? 我有个一实体类保存在了session中,怎么在转换为实体类啊 如何在自定义控件中使用第三方控件? 如何在vs2008中实现frameset的功能啊?vs2008中不支持frameset 帮忙~ 我已提交表单就数据没有帮定到实列 asp.net能不能用md5函数? 初中文凭的有人要吗 redis的问题 tree js 传值 64位系统上用asp.net连接oracle数据出现的问题
{
string viewStateNameDelimiter = "__VIEWSTATE";
string valueDelimiter = "value=\"";
int viewStateNamePosition = s.IndexOf(viewStateNameDelimiter);
int viewStateValuePosition = s.IndexOf(
valueDelimiter, viewStateNamePosition
); int viewStateStartPosition = viewStateValuePosition +
valueDelimiter.Length;
int viewStateEndPosition = s.IndexOf("\"", viewStateStartPosition); return HttpUtility.UrlEncodeUnicode(
s.Substring(
viewStateStartPosition,
viewStateEndPosition - viewStateStartPosition
)
);
}
明白了?
不是啊,我是要用Java写代码,你写了个C#代码对我- -
{
BasicHttpGetProcessor httpGet = null;
String content = "";
try
{
httpGet = new BasicHttpGetProcessor(getHttpclient() , url);
HttpResponse response = httpGet.sendGet();
content = EntityUtils.toString(response.getEntity());
}
catch(Exception e)
{
if(httpGet != null)
{
httpGet.cancel();
}
e.printStackTrace();
throw new MessageException("抓取出现异常");
}
finally
{
if(httpGet != null)
{
httpGet.close();
}
} return fetchViewStateByHtml(content);
} private String[] fetchViewStateByHtml(String html) throws MessageException
{
String[] result = new String[2];
try
{
Parser parser = Parser.createParser(html , "UTF-8");
NodeFilter filter = new NodeClassFilter(InputTag.class);
NodeList nodeList =parser.extractAllNodesThatMatch(filter);
InputTag inputTag1 = null;
InputTag inputTag2 = null;
for(int i = 0 ; i < nodeList.size() ; i++)
{
InputTag it = (InputTag)nodeList.elementAt(i);
String name = it.getAttribute("name");
if("__VIEWSTATE".equals(name))
{
inputTag1 = it;
}
if("__EVENTVALIDATION".equals(name))
{
inputTag2 = it;
}
} if(inputTag1 != null)
{
result[0] = inputTag1.getAttribute("value");
}
if(inputTag2 != null)
{
result[1] = inputTag2.getAttribute("value");
}
}
catch(Exception e)
{
e.printStackTrace();
throw new MessageException("抓取出现异常!");
} return result;
}一般页面的viewstate,是post的url传入第一个方法,然后get请求url得到的content,最后parser出来的
有一些页面的viewstate与get得到的viewstate不同,应该直接用第二个方法parser前一个页面运行之后的content,就能得到变化的viewstate。
我的问题就是这样解决的,不知道还有其它情况没
ViewState Saved in Custom Store:
protected override object LoadPageStateFromPersistenceMedium()
{
LosFormatter format = new LosFormatter();
return format.Deserialize(YourDataStore["ViewState"]);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
LosFormatter format = new LosFormatter();
StringWriter writer = new StringWriter();
format.Serialize(writer, viewState);
YourDataStore["ViewState"] = writer.ToString();
}看一下 ViewState 的内部格式到底是什么。
每个控件的 ViewState 保存在一个三元组中(Triplet, System.Web.UI.Triplet).
其 First 对象是:
一个 Pair(System.Web.UI.Pair)
或
Array or Pairs, of ArrayLists of related name-values.
Second 对象:
该控件在控件树中的索引的 ArrayList
Third 对象:
子控件的类似的三元组的 ArrayList