1

私はこれに不慣れです。これは私の処女の航海です。当面のタスクは、WebRequest / WebResponseを介してWebアプリのページフローをナビゲートするトランザクションをC#で作成することです。リクエスト/レスポンスメカニズムが機能し、Cookieとすべて(POST URLとPOST本文のハードコードされた値でトランザクションを正常に実行できます)、WebRequestの値のペアからWebRequestの動的POST本文とPOSTURLを生成するのは困難です。基本的に、フローが最初のWebRequestで開始されると、これは常に同じ静的URLと「ハードコードされた」本文を持ち、後続の各Requestは、前の応答のFORM値のペアから構築されます。たとえば、応答に含まれる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>

次に、[送信]に次のURLがあります。

 <a class="detailBtnOn" href="javascript:submitForm('express?displayAction=CreateAccountWizard&amp;saveAction=SaveCreateSICCode&amp;flow=forward&amp;saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&amp;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(var d in page.DocumentNode.Descendants( "div"))、-何も変更されません)


FORMプリントアウトパーサーで何が起こっているのか、および応答からの要求を構築するための解析エンジンを構築する方法についてのヘルプや提案をいただければ幸いです。

4

1 に答える 1

0

HtmlAgilityPackを使用した HTML ページの解析と、このhttp://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.htmlおよびhttp://htmlagilitypack.codeplex.com/discussions/を確認してください。 247206およびHtmlAgility Pack を使用して特定のフォームから入力を取得するにはどうすればよいですか? 言語: C#.net

編集 - いくつかの詳細情報:

HTMLドキュメントのフォームをforeach経由でループしますが、現在のフォームを参照せずに次のforeachでDIVを追跡します...内側のforeachループでは、次のようなものが必要です

foreach (var d in f.SelectNodes(".//div"))

foreach (var i in d.SelectNodes(".//input"))
于 2011-08-05T03:39:45.273 に答える