テストしたのは、Windows7 + Visual Studio 2010 + WPF アプリケーションです。 Web アクセスには、UrlEncode が必要になりますが、HttpUtility.UrlEncode はプロジェクトのプロパティで、『.NET Framework 4』にして System.Web を参照します。最初にプロジェクトを作成した場合、『.NET Framework 4 Client Profile』にセットされている場合があり、その場合 System.Web を参照できません。 HttpUtility.UrlEncode は、Windows Phone(OS 7.1) にもある事はあるのですが、エンコード結果が UTF-8 系列しか指定できないので、Encoding を指定する第二引数がありません。参照も、System.Windows の中の System.Net にあります。ですから、このクラスは Windows Phone(OS 7.1) では使用できません。 %エンコーディングの仕様が違いますが、WEB へ送信する場合は、Uri.EscapeDataString でも使用可能で、Twitter への投稿ではこちら(RFC 3986)が良いと思いますが、文字列は UTF-8 に変換されてエンコーディングされます。
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;
namespace winofsql {
class Tool {
public static string serverEncoding = "utf-8";
// *********************************************
// UTF-8 POST
// *********************************************
public static string Post(string url,
Dictionary<string, string> param,
UploadStringCompletedEventHandler UploadStringCompleted=null) {
string result = "";
try {
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.GetEncoding(serverEncoding);
if ( UploadStringCompleted != null ) {
// 呼び出し側でラムダ式を使う事を想定した
// イベント登録
webClient.UploadStringCompleted += UploadStringCompleted;
}
webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";
string data_string = "";
foreach (KeyValuePair<string, string> kvp in param)
{
if (data_string != "")
{
data_string += "&";
}
data_string += kvp.Key + "=";
// *******************************************************
// プロジェクトのプロパティの対象フレームワークを
//『Framework 4』 にして System.Web を参照します
// *******************************************************
data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
}
webClient.UploadStringAsync(new Uri(url), "POST", data_string);
}
catch (Exception Err) {
result = "ERROR: " + Err.Message;
}
return result;
}
// *********************************************
// エンコード指定 POST
// *********************************************
public static string Post(string url,
string encoding,
Dictionary<string, string> param,
UploadStringCompletedEventHandler UploadStringCompleted=null) {
string result = "";
try {
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.GetEncoding(serverEncoding);
if ( UploadStringCompleted != null ) {
// 呼び出し側でラムダ式を使う事を想定した
// イベント登録
webClient.UploadStringCompleted += UploadStringCompleted;
}
webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";
string data_string = "";
foreach (KeyValuePair<string, string> kvp in param)
{
if (data_string != "")
{
data_string += "&";
}
data_string += kvp.Key + "=";
// *******************************************************
// プロジェクトのプロパティの対象のフレームワークを
//『.NET Framework 4』 にして System.Web を参照します
// *******************************************************
data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
}
webClient.UploadStringAsync(new Uri(url), "POST", data_string);
}
catch (Exception Err) {
result = "ERROR: " + Err.Message;
}
return result;
}
// *********************************************
// URL のみ呼び出し GET
// *********************************************
public static string Get(
string url,
DownloadStringCompletedEventHandler DownloadStringCompleted=null) {
string result = "";
try {
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.GetEncoding(serverEncoding);
if ( DownloadStringCompleted != null ) {
// 呼び出し側でラムダ式を使う事を想定した
// イベント登録
webClient.DownloadStringCompleted += DownloadStringCompleted;
}
webClient.DownloadStringAsync(new Uri(url));
}
catch (Exception Err) {
result = "ERROR: " + Err.Message;
}
return result;
}
// *********************************************
// データ呼び出し( UTF-8 ) GET
// *********************************************
public static string Get(
string url,
Dictionary<string, string> param,
DownloadStringCompletedEventHandler DownloadStringCompleted=null) {
string result = "";
try
{
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.GetEncoding(serverEncoding);
if (DownloadStringCompleted != null)
{
// 呼び出し側でラムダ式を使う事を想定した
// イベント登録
webClient.DownloadStringCompleted += DownloadStringCompleted;
}
string data_string = "";
foreach (KeyValuePair<string, string> kvp in param)
{
if (data_string != "")
{
data_string += "&";
}
data_string += kvp.Key + "=";
// *******************************************************
// プロジェクトのプロパティの対象フレームワークを
//『Framework 4』 にして System.Web を参照します
// *******************************************************
data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
}
webClient.DownloadStringAsync(new Uri(url + "?" + data_string));
}
catch (Exception Err)
{
result = "ERROR: " + Err.Message;
}
return result;
}
// *********************************************
// データ呼び出し( エンコード指定 ) GET
// *********************************************
public static string Get(
string url,
string encoding,
Dictionary<string, string> param,
DownloadStringCompletedEventHandler DownloadStringCompleted=null) {
string result = "";
try
{
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.GetEncoding(serverEncoding);
if (DownloadStringCompleted != null)
{
// 呼び出し側でラムダ式を使う事を想定した
// イベント登録
webClient.DownloadStringCompleted += DownloadStringCompleted;
}
string data_string = "";
foreach (KeyValuePair<string, string> kvp in param)
{
if (data_string != "")
{
data_string += "&";
}
data_string += kvp.Key + "=";
// *******************************************************
// プロジェクトのプロパティの対象フレームワークを
//『Framework 4』 にして System.Web を参照します
// *******************************************************
data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
}
webClient.DownloadStringAsync(new Uri(url + "?" + data_string));
}
catch (Exception Err)
{
result = "ERROR: " + Err.Message;
}
return result;
}
}
}
使用方法のサンプル
Tool.serverEncoding = "utf-8";
Tool.Post("http://student.xii.jp/lightbox/php_sample_1/log.php",
"utf-8",
new Dictionary<string, string>() { { "send", "ok" }, { "text", "日本語" } },
(object _sender, UploadStringCompletedEventArgs _e) =>
{
// Error プロパティがセットされているとエラー
if (_e.Error != null)
{
// エラー処理
}
// 正常な結果
else
{
// 正常処理
}
});
関連する記事 Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス Android で Post と Get いろいろな言語におけるバーセントエンコーディング![]()
|
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート






