通过winform发送帖子数据

时间:2013-06-04 15:36:45

标签: c# jquery winforms

我在静态IP上通过以太网连接了一个设备。有一个html接口与设备通信。接口监视设备的io。它具有用于更改IP地址,子网掩码,MAC地址和默认网关等配置的配置设置。它也是您向设备发送命令的方式。

我想制作一个C#Windows表单,仅代表我需要的功能。我被抓住的地方是从表单发送命令。

html界面正在使用jquery将命令发送回设备。

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

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

我目前正在尝试通过WebRequest发回帖子,这只是返回URI的html。我得出的结论是,我不应该使用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();
    }

任何有关发送帖子的正确方法以及如何格式化帖子数据的帮助都将非常受欢迎。

3 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:0)

您应该在像Fiddler这样的调试器中查看请求,并在真实站点和代码发送的请求之间进行比较。上面代码段中的一个可疑之处是您以JSON格式发送数据,但声称它是“application / x-www-form-urlencoded”而不是“application / json”。

您可能还需要设置User-Agent和/或Cookie或身份验证标头等标头。

答案 2 :(得分: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(你似乎是),你应该考虑使用async方法发送,该方法不会阻止主线程(UI线程)

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

如果您想使用HttpWebRequest类让我知道,我会编辑我的答案;)