2017-08-08 16 views
0

MVC 5アプリケーションを実行していますが、別のソリューションにあるAPIコントローラメソッドを呼び出しています。MVC ApiコントローラSerielizedパラメータ

私はHttpClient()を使用しています。私はPostAsJsonAsyncにいくつかのパラメータ、クラスのインスタンスを呼び出しています。

このようになります。

string apiUrl = "localhost:8080/api/"; 
ContactWF contactWF = new contactWF(); 
contactWF.contact_id=0; 
contactWF.UserOrigin_id=20006 
contactWF.ProcessState_id=2; 

using (HttpClient client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri(apiUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
    HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF); 
    if (response.IsSuccessStatusCode) 
    { 
     return response.Content.ReadAsAsync<int>().Result; 
    } 
} 

APIコントローラのメソッドは次のとおりです。

[ActionName("Method")] 
[HttpGet] 
public int Method([FromBody] ContactWF userwf) 
{ 
    return 10; 
} 

それは罰金作品...

私の問題は、私は直列化されたパラメータクラスのインスタンス をしようとしたとき、私はこの1つ

string jsonData = JsonConvert.SerializeObject(contactWF); 
HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", jsonData).Result; 

でライン

HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF); 

を交換ですError:405 ...

Json文字列のように見えますが、パラメータとして認識されません。

My Jsonの文字列は次のようになります。

"{\"Contact_id\":0,\"Description\":null,\"ProcessState_id\":2,\"Type_id\":0,\"Object_id\":0,\"Parent_id\":null}" 

これは、jsonへのContactWDクラスコンバータです。

どうしたのですか?あなたのAPIコントローラでHttpPostへ

答えて

1

メソッドPostAsJsonAsyncはパラメータオブジェクトを自分自身でシリアル化するため、json 文字列を再度シリアル化します。

あなたが見つからないHttpPost取得エラー404メソッドでメソッドHttpClient.PostAsync

string jsonData = JsonConvert.SerializeObject(contactWF); 
var stringContent = new StringContent(jsonData, Encoding.UTF8, "application/json"); 
HttpResponseMessage response = await client.PostAsync("api/Filler/CountMensajeByUser", stringContent); 
+0

ありがとう...私は2回連れていた...しかし、私が理解していないことは、私がPostAsJsonAsyncを使用している場合、方法は文字列を取得する必要がありますか?今度は、同じクラスのインスタンスを取得します...ありがとう – Diego

+0

Web Apiは、メソッドのargumetクラスにjsonボディを非直列化します。 'public int Method([FromBody] string userwf)'と宣言すれば、2回直列化されたオブジェクトを持つ2番目の変種が動作し、userwf直列化オブジェクトに入ります。 –

1

変更動詞

[ActionName("Method")] 
[HttpPost] 
public int Method([FromBody] ContactWF userwf) 
{ 
    return 10; 
} 

更新

あなたはからのサンプルコードを見てみましょうPostAsJsonAsync

HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", contactWF).Result; 

でオブジェクトをシリアル化する必要はありません。マイクロ https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing

internal class NewIdeaDto 
    { 
     public NewIdeaDto(string name, string description, int sessionId) 
     { 
      Name = name; 
      Description = description; 
      SessionId = sessionId; 
     } 

     public string Name { get; set; } 
     public string Description { get; set; } 
     public int SessionId { get; set; } 
    } 

//Arrange 
var newIdea = new NewIdeaDto("Name", "", 1); 

// Act 
var response = await _client.PostAsJsonAsync("/api/ideas/create", newIdea); 

// Assert 
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); 
+0

を使用し、何らかの理由で自分自身をオブジェクト直列化が必要な場合... – Diego

+0

あなたは正しいURIに投稿しましたか?私は2つの異なるエンドポイント "連絡先/メソッド"& "API /フィラー/ CountMensajeByUser"を参照してください –

+0

はい...私はこの例の名前を交換...ありがとう..私はHttpGetを置く必要があります、メソッドが見つかりません。しかし、私の主な問題は、シリアル化されたJsonにです... – Diego

関連する問題