3

Web API サービスに投稿しようとしています。ポイントは、次のようなメッセージを送信しながら

{ message: "it is done" }

正常に動作しています。ただし、メッセージで çıöpş などの特殊文字を使用すると、json を変換できず、投稿オブジェクトが null のままになります。私に何ができる?それは現在の文化の問題か、それ以外の何かです。HttpUtility クラスをエンコードする HtmlEncoded スタイルとして投稿パラメーターを送信しようとしましたが、どちらも機能しませんでした。

public class Animal{

  public string Message {get;set;}
}

Web API メソッド

public void DoSomething(Animal a){

}

クライアント

Animal a = new Animal();
a.Message = "öçşistltl";
string postDataString = JsonConvert.SerializeObject(a);        
string URL = "http://localhost/Values/DoSomething";
WebClient client = new WebClient();

client.UploadStringCompleted += client_UploadStringCompleted;
client.Headers["Content-Type"] = "application/json;charset=utf-8";
client.UploadStringAsync(new Uri(URL), "POST",postDataString);

よろしくお願いします、

ケマル

4

1 に答える 1

8

1 つの可能性はUploadDataAsyncメソッドを使用することです。これにより、データをエンコードするときに UTF-8 を指定できます。使用しているUploadStringAsyncメソッドは基本的Encoding.Defaultに、データをソケットに書き込むときにデータをエンコードするために使用されるためです。そのため、システムが UTF-8 以外のエンコーディングを使用するように構成されている場合、競合する可能性のあるUploadStringAsyncコンテンツ タイプ ヘッダーで指定したシステム エンコーディングを使用するため、問題が発生します。charset=utf-8

メソッドを使用UploadDataAsyncすると、意図をより明確にすることができます。

Animal a = new Animal();
a.Message = "öçşistltl";
string postDataString = JsonConvert.SerializeObject(a);        
string URL = "http://localhost/Values/DoSomething";
string postDataString = JsonConvert.SerializeObject(a);
using (WebClient client = new WebClient())
{
    client.UploadDataCompleted += client_UploadDataCompleted;
    client.Headers["Content-Type"] = "application/json; charset=utf-8";
    client.UploadDataAsync(new Uri(URI), "POST", Encoding.UTF8.GetBytes(postDataString));
}

別の可能性は、クライアントのエンコーディングを指定して使用することUploadStringAsyncです:

Animal a = new Animal();
a.Message = "öçşistltl";
string postDataString = JsonConvert.SerializeObject(a);        
string URL = "http://localhost/Values/DoSomething";
string postDataString = JsonConvert.SerializeObject(a);
using (WebClient client = new WebClient())
{
    client.Encoding = Encoding.UTF8;
    client.UploadStringCompleted += client_UploadStringCompleted;
    client.Headers["Content-Type"] = "application/json; charset=utf-8";
    client.UploadStringAsync(new Uri(URI), "POST", postDataString);
}

または、Microsoft.AspNet.WebApi.ClientNuGet パッケージをクライアントにインストールすると、新しいHttpClientクラス (ブロックの新しい子) を直接使用して、代わりに WebAPI を使用できますWebClient

Animal a = new Animal();
a.Message = "öçşistltl";
var URI = "http://localhost/Values/DoSomething";
using (var client = new HttpClient())
{
    client
        .PostAsync<Animal>(URI, a, new JsonMediaTypeFormatter())
        .ContinueWith(x => x.Result.Content.ReadAsStringAsync().ContinueWith(y =>
        {
            Console.WriteLine(y.Result);
        }))
        .Wait();
}
于 2012-08-22T21:34:51.880 に答える