1

ルーター構成を自動化するアプリケーションを作成しようとしています。残念ながら、私たちが使用しているルーターでは、telnet はオプションではありません。

そのため、C# WebClient クラスを使用して Cisco Web インターフェイスとやり取りする必要がありました。

今までは、NameValueCollection と WebClient.UploadValues を使用して必要なものをすべて設定できました。

フォームのすべての入力要素を取得し、フォームの入力タイプに対応する名前の値 Collection をアップロードして、それぞれの値を目的の設定に設定します。

しかし今、私は問題に遭遇しました。

フォームの 1 つでは、複数選択コントロールを使用して、入力タイプではなく、入力データの配列を処理しています。

私はこれを設定する方法について完全に途方に暮れています。

multiselect の html は次のとおりです。

<select multiple class="MultiSelect" name="PortRangeList" size="12" onChange="showList(this.form.PortRangeList);" style="width: 100%">
    <option value="All Traffic{[(*-*-*)]}1;0;1;65535;0}">All Traffic [TCP&UDP/1~65535]</option>
    <option value="DNS{[(*-*-*)]}2;17;53;53;0}">DNS [UDP/53~53]</option>
    <option value="FTP{[(*-*-*)]}3;6;21;21;0}">FTP [TCP/21~21]</option>
    ...
</select> 

入力タイプを使用していたときは、次のようにするだけです

NameValueCollection formNetworkData = new NameValueCollection();
formNetworkData["ipAddr"] = "192.168.1.2";
formNetworkData["lanMask"] = "255.255.255.0";
downloadedData = _routerWebClient.UploadValues(_routerIP + NETWORK, formNetworkData);

しかし、この新しいフォームのコードを見ると、送信する直前に表示され、複数選択のすべてのオプションが選択されています。

私はおそらくこの質問を不十分に尋ねたことを認識していますが、どんな支援も大歓迎です.


Chrome デバッガー PortRangeList の使用は、まさにあなたが言ったとおりです。

入力タイプは5種類

submitStatus、upnpOpen (など...)

それらの場合、私のコードは次のようになります

NameValueCollection formData = new NameValueCollection();
formData["submitStatus"]="1";
formData["upnpOpen"]="0";
downloadedData = _routerWebClient.UploadValues(SERVICE0, formData);

しかし、PortRangeList データを送信するために NameValueCollection を使用することはできません。これは、名前に複数の値を含めることができないためです。

どうやってそれを提出できますか?

WebClient.UploadData、WebClient.UploadFile、または WebClient.UploadString でしょうか?

4

3 に答える 3

0

FiddlerまたはWiresharkを使用して、動作するとき (「通常の」ブラウザ) と動作しないとき (コード) を比較します... 違いがわかったら、それに応じてコードを変更できます...

于 2012-06-11T21:06:14.953 に答える
0

「PortRangeList」パラメーターを複数回 (オプションごとに 1 回) 渡すことで、選択したオプションを渡す必要があります。

PortRangeList=All Traffic{[(*-*-*)]}1;0;1;65535;0}&PortRangeList=DNS{[(*-*-*)]}2;17;53;53;0}&PortRangeList=FTP{[(*-*-*)]}3;6;21;21;0}

それがブラウザのやり方です。WebClient を使用しているので、これを試してください。

PortRangeList=All Traffic{[(*-*-*)]}1;0;1;65535;0},DNS{[(*-*-*)]}2;17;53;53;0},FTP{[(*-*-*)]}3;6;21;21;0}

明らかに、すべてを適切に URL エスケープする必要があります。

于 2012-06-11T21:06:31.897 に答える
0

私は最終的な答えを投稿すると思った。

最後に、ここに示されている正確なソリューションを使用しました。 http://anhonga.wordpress.com/2010/05/06/using-webclient-with-uploadvalues-and-uploadstring-to-simulate-post/

これは彼のコードですが、私は本質的にまったく同じことをしました (グローバル変数を使用せずに)

StringBuilder _strBld = new StringBuilder();
int _intItemCount = 0;

protected void btnSubmit_Click(object sender, EventArgs e)
{
    System.Net.WebClient myWebClient = new System.Net.WebClient();
    myWebClient.Headers.Add("Charset", "text/html; charset=UTF-8");
    myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // ◄  This line is essential

// Perform server-side validations (same as before)
if (this.F_Name.Text.Length == 0 || this.L_Name.Text.Length == 0)
{ AppendError("First and Last name must be provided"); }
…

// Add the user-provided name values
AppendUploadString("last_name", this.L_Name.Text);
AppendUploadString ("first_name", this.F_Name.Text);
AppendUploadString ("address", this.Address.Text);

// Add the Toppings
foreach (ListItem item in this.ToppingsChkBoxList.Items)
{
if (item.Selected)
    {
        AppendUploadString("Toppings", item.Value.ToString());
    }
}

myWebClient.UploadString("https http://www.Destination.com/...?encoding=UTF-8", "POST", _strBld.ToString());
}

private void AppendUploadString(string strName, string strValue)

{
    _intItemCount++;
    _strBld.Append((intItemCount == 1 ? "" : "&") + strName + "=" + System.Web.HttpUtility.UrlEncode(strValue));
    // Update: Use UrlEncode to ensure that the special characters are included in the submission
}
于 2012-06-13T12:47:48.283 に答える