0

静的 IP でイーサネット経由で接続されたデバイスがあります。デバイスと通信するための html インターフェイスがあります。インターフェイスは、デバイスの io を監視します。IP アドレス、サブネット マスク、MAC アドレス、デフォルト ゲートウェイなどを変更するための構成設定があります。これは、デバイスにコマンドを送信する方法でもあります。

必要な機能のみを表す C# Windows フォームを作成したいと考えています。私が追いついているのは、フォームからコマンドを送信することです。

html インターフェイスは jquery を使用してコマンドをデバイスに送り返します。

function sendCMD(indata) {$.post("setcmd.cgx", indata, function (data) {});

sendCMD({ver : "1",cmd : "abf"});

私は現在、URIのhtmlを返すだけのWebRequestを介して投稿を送り返そうとしています。これに WebRequest を使用してはならない、または投稿データを間違って送信しているという結論に達しました。

私が現在持っているもの:

private void btnAimingBeamOn_Click(object sender, EventArgs e)
    {
        string postData = "\"setcmd.cgx\", {\n\rver : \"1\", \n\rcmd : \"abn\"\n\r}, function (data) {}";
        byte[] byteArray = Encoding.UTF8.GetBytes(

        Uri target = new Uri("http://192.168.3.230/index.htm"); 
        WebRequest request = WebRequest.Create(target);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;

        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse response = request.GetResponse();
        txtABNStatus.Text = (((HttpWebResponse)response).StatusDescription);

        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        txtABNResponse.Text = (responseFromServer);

        reader.Close();
        response.Close();
        dataStream.Close();
    }

投稿を送信する適切な方法と、投稿データをフォーマットする方法についての助けをいただければ幸いです。

4

3 に答える 3

4

投稿するデータに追加するのではなく、「setcmd.cgx」にデータを投稿する必要があります。

// You need to post the data as key value pairs:
string postData = "ver=1&cmd=abf";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

// Post the data to the right place.
Uri target = new Uri("http://192.168.3.230/setcmd.cgx"); 
WebRequest request = WebRequest.Create(target);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

using (var dataStream = request.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
}

using (var response = (HttpWebResponse)request.GetResponse())
{
   //Do what you need to do with the response.
}
于 2013-06-04T15:51:11.503 に答える
0

マルチスレッドが必要ない場合は、webclient がその役割を果たします。

 string data = "\"setcmd.cgx\", {\n\rver : \"1\", \n\rcmd : \"abn\"\n\r}, function (data) {}";
    WebClient client = new WebClient();
    client.Encoding = System.Text.Encoding.UTF8;

    string reply = client.UploadString("http://192.168.3.230/index.htm", data);
    //reply contains the web responce

また、winforms を使用している場合 (そうであるように)、メイン スレッド (UI スレッド) をブロックしない非同期メソッドで送信することを検討する必要があります。

string reply = client.UploadStringAsync("http://192.168.3.230/index.htm", data);

HttpWebRequest クラスを使用する場合はお知らせください。回答を編集します ;)

于 2013-06-04T15:46:38.573 に答える
0

Fiddler などのデバッガーでリクエストを監視し、実際のサイトとコードによって送信されたリクエストを比較する必要があります。上記のスニペットで疑わしい点の 1 つは、データを JSON 形式で送信しているにもかかわらず、「application/json」ではなく「application/x-www-form-urlencoded」であると主張していることです。

User-Agent などのヘッダー、および/または Cookie または認証ヘッダーを設定する必要がある場合もあります。

于 2013-06-04T15:39:20.533 に答える