web-dev-qa-db-ja.com

C#でフォームに入力し、Webclientで送信する方法

C#でWebClient、HttpResponse、およびHttpRequestの各ライブラリを使用するのは初めてなので、質問が読みにくい場合はご容赦ください。

URLを開くことができるC#に基づいたWinFormを構築する必要がありますが、これは基本認証で保護されています。私はこれを次のようにヘッダーに追加してこれを行いました:

using (WebClient wc = new WebClient())
{
    wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " +
    Convert.ToBase64String(
    Encoding.ASCII.GetBytes(username + ":" + password)));
}

ここまでは順調ですね!ここでフォームに数字を入力したいのですが、サイトからソースコードを見つけて、名前が「数字」であることを発見しました。だから私はこれを書く:

NameValueCollection formData = new NameValueCollection();  
formData["number"] = number
byte[] responseBytes = wc.UploadValues(theurl, "POST", formData);
string response = Encoding.ASCII.GetString(responseBytes);
textBox_HTML.Text = response; 

しかし、これをどのように提出すればよいですか? 「検索結果」を受け取りたい...

27
Soren Mikkelsen

これにはおそらく HttpWebRequest を使用する必要があります。以下に簡単な例を示します。

var strId = UserId_TextBox.Text;
var strName = Name_TextBox.Text;

var encoding=new ASCIIEncoding();
var postData="userid="+strId;
postData += ("&username="+strName);
byte[]  data = encoding.GetBytes(postData);

var myRequest =
  (HttpWebRequest)WebRequest.Create("http://localhost/MyIdentity/Default.aspx");
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
var newStream=myRequest.GetRequestStream();
newStream.Write(data,0,data.Length);
newStream.Close();

var response = myRequest.GetResponse();
var responseStream = response.GetResponseStream();
var responseReader = new StreamReader(responseStream);
var result = responseReader.ReadToEnd();

responseReader.Close();
response.Close();
49
BFree

これを試して:

using System.Net;
using System.Collections.Specialized;  

NameValueCollection values = new NameValueCollection();
values.Add("TextBox1", "value1");
values.Add("TextBox2", "value2");
values.Add("TextBox3", "value3");
string Url = urlvalue.ToLower();

using (WebClient client = new WebClient())
{
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    byte[] result = client.UploadValues(Url, "POST", values);
    string ResultAuthTicket = System.Text.Encoding.UTF8.GetString(result);
}
38
mrlingam

問題の解決策を見つけました。まず第一に、http-communicationの基本のいくつかについて混乱しました。これは、私が書いたpythonスクリプトが原因で、通信とは異なるアプローチがあります。

最初からPOSTデータを生成し、フォームアクションに含まれているuriを開いて解決しました。

3
Soren Mikkelsen

System.Net.Http.HttpClientを使用してフォームを送信し、応答を文字列として読み取ります。

var formData = new Dictionary<string, string>();
formData.Add("number", number);

var content = new FormUrlEncodedContent(formData);

using (var httpClient = new HttpClient())
{
    var httpResponse = await httpClient.PostAsync(theurl, content);

    var responseString = await httpResponse.Content.ReadAsStringAsync();
}
1
user3285954

BFreeの答えはすばらしい。ただし、データ連結は実際にURLエンコードする必要があります。そうしないと、データ内の「=」や「&」記号などの問題が発生します。

UrlencodedでUTF-8をサポートするVB.NETバージョンを以下に示します(url-encodingにはSystem.Web.dllへの参照が必要です。これは、.NET 4 Compact Frameworkから通常の。 NET 4 Framework)。

Imports System.Web
Imports System.Net
Imports System.IO

Public Class WebFormSubmitter

    Public Shared Function submit(ByVal address As String,
                                  ByVal values As Dictionary(Of String, String)) As String
        Dim encoding As New UTF8Encoding
        Dim postData As String = getPostData(values:=values)
        Dim data() As Byte = encoding.GetBytes(postData)

        Dim request = CType(WebRequest.Create(address), HttpWebRequest)
        request.Method = "POST"
        request.ContentType = "application/x-www-form-urlencoded"
        request.ContentLength = data.Length
        Dim newStream = request.GetRequestStream()
        newStream.Write(data, 0, data.Length)
        newStream.Close()

        Dim response = request.GetResponse()
        Dim responseStream = response.GetResponseStream()
        Dim responseReader = New StreamReader(responseStream)
        Return responseReader.ReadToEnd()
    End Function

    Private Shared Function getPostData(ByVal values As Dictionary(Of String, String)) As String
        Dim postDataPairList As New List(Of String)
        For Each anEntry In values
            postDataPairList.Add(anEntry.Key & "=" & HttpUtility.UrlEncode(anEntry.Value))
        Next
        Return String.Join(separator:="&", values:=postDataPairList)
    End Function

End Class

UploadValuesを使用して既に送信しています。問題は、「結果検索」とは何ですか?ページは何を返しますか? HTML?その場合- HTML Agility Pack は、htmlを解析する最も簡単な方法です。

0
Marc Gravell