私はこれで初めてです。これは私の処女航海です.Cart#でWebRequest / WebResponse経由でWebアプリケーションのページフローをナビゲートするトランザクションを作成することです。リクエスト/レスポンスメカニズム、クッキー、すべて(POST URLとPOSTボディのハードコードされた値でトランザクションを正常に実行できます)が得られますが、WebRequestの値ペアからWebRequestの動的POSTボディとPOST URLを生成するのは難しい。基本的には、フローが常に同じ静的URLと「ハードコードされた」本文を持つ最初のWebRequestで開始されると、それに続く各Requestは前のResponseのFORM値のペアから構築されます。たとえば、ResponseにあるFORMの部分(ここでは、HTMLの開閉記号を角括弧で置き換えていますが、HTMLをここに直接貼り付ける方法はわかりません):
<form id="expressform" method="post" action="">
<div>
<input type="hidden" name="ScreenData.widgets.modified" value=""/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.widgets.modified"/><input type="hidden" name="ScreenData.marshalled" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.marshalled"/><input type="hidden" name="isCreateAccountWizard" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="isCreateAccountWizard"/>
<input type="hidden" name="versionPoint" value="77777"/>
次のように値を送信するフォームのテキスト領域を次に示します。
<tr>
<td class="dataOut" style="padding-left:30px">
<textarea name="ScreenData.sicInfo.natureOfBusiness" rows="5" cols="60" class="dataOut" onmouseup="textAreaCounter(this,250);;" onkeypress="textAreaCounter(this,250);;" onkeyup="textAreaCounter(this,250);;" onchange="markDataDirty(this);;"></textarea>
</td>
</tr>
SubmitにURLがあります:
<a class="detailBtnOn" href="javascript:submitForm('express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3')">Submit</a>
そして次のWebResponseはPOST本体にこれを持っているはずです:
ScreenData.widgets.modified=&ScreenData.header.hidden.name=ScreenData.widgets.modified&ScreenData.marshalled=true&ScreenData.header.hidden.name=ScreenData.marshalled&isCreateAccountWizard=true&ScreenData.header.hidden.name=isCreateAccountWizard&versionPoint=77777&ScreenData.commonHeaderInfo.accountName=SomeAccountName&ScreenData.commonHeaderInfo.effectiveDate=08%2F01%2F2011&ScreenData.sicInfo.natureOfBusiness=business&ScreenData.sicInfo.sic=7777&ScreenData.widgets.modified=ScreenData.sicInfo.natureOfBusiness&ScreenData.widgets.modified=ScreenData.sicInfo.sic
これをURLとします:
express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3
しかし、私はこの構文解析エンジンを構築する方法を理解できないだけでなく、FORMから値ペアを取得することさえできません。私はAgilityPackを使用しようとしていますが、ここでは少なくとも重要な "FORM"コンテンツを印刷する必要があります。
var page = new HtmlDocument();
page.OptionReadEncoding = false;
var stream = HttpWResponse.GetResponseStream();
page.Load(stream);
foreach (var f in page.DocumentNode.Descendants("form"))
{
foreach (var d in page.DocumentNode.Descendants("div"))
{
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info((f.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")) + ": ");
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(f.GetAttributeValue("method", "<no method>") + ' ');
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(f.GetAttributeValue("action", "<no action>"));
foreach(var i in f.Descendants("input"))//{
{
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info('\t' + (i.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")));
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(" (");
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(i.GetAttributeValue("type", "<no type>"));
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info("): " + i.GetAttributeValue("value", "<no value>"));
}
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info("");
}
}
しかし、これだけが表示されます:
INFO EventsLogger -
INFO EventsLogger - expressform:
INFO EventsLogger -
INFO EventsLogger - post
(もし私が "div"ビットを取り除くならば、foreach(page.DocumentNode.Descendants( "div")のvar d)、何も変わらない)
FORMプリントアウトパーサで何が起こっているのか、そしてレスポンスからリクエストを作成するための構文解析エンジンを構築する方法についての助言や提案は非常に高く評価されます。
これをチェックアウトするHtmlAgilityPackとこのhttp://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.htmlとhttp://htmlagilitypack.codeplex.com/discussions/で HTMLページを解析する 247206とHtmlAgility Packで特定のフォームからの入力をどのように取得できますか? Lang:C#.net
編集 - いくつかの詳細情報:
あなたはHTML文書のフォームをforeach経由でループしますが、現在のフォームを参照せずに次のforeachでDIVを実行します。内側のforeachループでは、次のようなものが必要です
foreach (var d in f.SelectNodes(".//div"))
そして
foreach (var i in d.SelectNodes(".//input"))