2012-03-25 15 views
12

MVC4の新しいWebAPI機能を使用してメソッドを作成し、Azureで実行させました。このメソッドでは、ユーザー名とパスワードのプロパティで構成される単純なLoginModelオブジェクトを投稿する必要があります。私は成功したバイオリンを使用してこのメ​​ソッドを呼び出すことができますPostAsync、HttpClient&Jsonを使用してC#Metro UIクライアントからMVC4 WebAPIメソッドを呼び出す

enter image description here

Iという条件で、:メソッドはその後、JSON形式でオブジェクトを応答:-)はい、私は、これはさらにかつて私は、このスピードバンプを乗り越える確保を計画しますリクエストヘッダーに "Content-Type:application/json"を含めます。それは200で返し、私はフィドラーインスペクタに入るとうまくJSONレスポンスオブジェクトを表示することができます。

enter image description here

私はしかし、問題のC#/ XAMLを使用してWindows8でMetroUIアプリからこの同じメソッドを呼び出すを持っています。私はHttpClientとC#の新しいAsyncのコンセプトを使い始めました。たとえContent-Typeを "application/json"にしたいと思っても私の投稿の呼び出しをどのようにフォーマットしたとしても、Fiddlerは500エラーを返すその試みがContent-Type: "text/html"を使用していたことを示しています。私は、これが問題の根本であることを信じて:

HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}"); 

     client.PostAsync("http://myapi.com/authentication", content).ContinueWith(result => 
     { 
      var response = result.Result; 

      response.EnsureSuccessStatusCode(); 
     }); 
:このメソッドに投稿し、JSONオブジェクトを取り戻すために

enter image description here

は私が考えられるすべてのものを試してみましたが、ここで私の最も最近の試みであります

これは、ここで

も失敗した別の試みであった "text/htmlの" に設定のContent-Typeと500エラーが発生:

HttpClient httpClient = new HttpClient(); 
HttpResponseMessage response = await httpClient.PostAsync("http://myapi.com/authentication", new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}", Encoding.UTF8, "application/json")); 
string statusCode = response.StatusCode.ToString(); 

誰でも正しい方向に向けることができますか?

ただNemesvのアドバイスに次のコードのおかげを試してみました:

HttpClient httpClient = new HttpClient(); 
     HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}"); 
     content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 


     HttpResponseMessage response = await httpClient.PostAsync("http://webapi.com/authentication", content); 

     string statusCode = response.StatusCode.ToString(); 
     response.EnsureSuccessStatusCode(); 

それは今私のリクエストヘッダに「アプリケーション/ JSONを」示しているが、まだWebセッションに「text/htmlのを」示しています

enter image description here

答えて

22

Headers.ContentTypeを設定し、これを試してみてください:

HttpClient httpClient = new HttpClient(); 
HttpContent content = new StringContent(@"{ ""Username"": """ + "etc." + @"""}"); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
HttpResponseMessage response = 
    await httpClient.PostAsync("http://myapi.com/authentication", content); 
string statusCode = response.StatusCode.ToString(); 
+0

ありがとうNemesv。ちょうどそれを試みたが、まだ500エラーを渡すことができませんが、私は、 "アプリケーション/ json"を使用していることをヘッダーが示していることを気付きます - しかし、レコードのWebセッションは "text/html"スクリーンをつかむ。 – CodeAbundance

+1

FYI:私の元の記事の一番下にある更新を参照してください。そして助けてくれてありがとう! – CodeAbundance

+0

FYI:コンテンツヘッダにパラメータを設定する方法だと思います。私はコードに停止を入れ、StringContent値を設定した後にHttpContentオブジェクトを走査し、UsernameまたはPassword項目を見つけることができませんでした。これをWebAPIに投稿するためのより良い方法を知っていますか?まだ私の最後にそれを探して... – CodeAbundance

6

これは動作しているいくつかの行方不明です。

UserLoginModel user = new UserLoginModel { Login = "username", Password = "password" }; 
string json = Newtonsoft.Json.JsonConvert.SerializeObject(user); 
HttpContent content = new StringContent(json); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost:1066/api/"); 
HttpResponseMessage response = client.PostAsync("Authenticate", content).Result; 

if (response.IsSuccessStatusCode) 
{ 
    var result = response.Content.ReadAsAsync<ResultModel>().Result; 
} 
else 
{ 
    return string.Empty; 
} 
+0

これは、JsonObjectディクショナリを手動で構築するのではなく、JSON.Netでオブジェクトをシリアライズした方がいいです(不要なコードであり、エンティティが変更されるとすぐに破棄されます)。 RTMでは、StringContentのコンストラクタを使用してメディアタイプとエンコーディングを指定することもできます。たとえば、UTF8を使用します。 var content = new StringContent(json、Encoding.UTF8、 "application/json")。 –

+1

はい、ありがとうございます。私のために働いています.. – andy

関連する問題