2017-01-15 2 views
5

У меня есть один api, вызывающий другой.HttpClient PostAsync опубликовал нулевой контент

и вот мой код, который, как представляется, вызывает ModelState.IsValid = false с другой стороны мира.

var baseUri = new Uri("http://localhost:5001/"): 
_httpClient.BaseAdress = baseUri; 
var data = new StringContent(content: model.Tostring(), 
      encoding: Encoding.UTF8, 
      mediaType: "application/json"); 

var response = await _httpClient.PostAsync("api/product", data); 

смотреть Post([FromBody]Product product) на апи называют я просто вижу product=null.

изменение к Post([FromBody]object product) также показаны null.

вызов api от Postman работает отлично. которые локализуют мою проблему до PostAsync. что происходит с моим PostAsync?

Edit:

Я знаю, что люди могли бы предложить PostAsJsonAsync, но я постараюсь это только после того, как я знаю, что проблема с PostAsync. :(

+1

Вы уверены, что 'model.ToString()' производит надлежащее JSON? И даже если это так, вам лучше по крайней мере использовать отдельный метод, например «ToJsonString», или даже не ставить код сериализации внутри этого класса вообще. –

+1

В любом случае без [MCVE] мы не можем вам помочь. –

+0

пятно на @EugenePodskal. 'model.ToString()' не делал то, что я думал, что это делает. меняется на 'content: JsonConvert.SerializeObject (model)' работает. это путь? –

ответ

2

Как указано в комментариях model не быть преобразованы в формат JSON, когда вы назвали model.ToString. Вы в конце концов понял, что вы можете использовать Json.NET сериализовать модель в формате JSON с JsonConvert.SerializeObject(model). Это будет работать для сериализации модель JSON.

вы могли бы пойти один шаг дальше и создать метод расширения для выполнения этой функции для вас

public class JSONStringExtension { 
    public static string ToJsonString(this object model) { 
     if(model is string) throw new ArgumentException("mode should not be a string"); 
     return JsonConvert.SerializeObject(model); 
    } 
} 

Это теперь позволит вам вызвать метод на вашей модели и преобразовывать его JSON в ваш код.

var baseUri = new Uri("http://localhost:5001/"): 
_httpClient.BaseAdress = baseUri; 
var data = new StringContent(content: model.ToJsonString(), //<--Extension method here 
      encoding: Encoding.UTF8, 
      mediaType: "application/json"); 

var response = await _httpClient.PostAsync("api/product", data); 

Метод расширения PostAsJsonAsync, который часто используется, в основном выполняет ту же самую вещь, которую вы в конечном итоге реализовали, абстрагировав шаг сериализации JSON для вас. внутренне он вызывает тот же метод PostAsync.

, который будет выглядеть немного как этот

public static Task<HttpResponseMessage> PostAsJsonAsync(this HttpClient httpClient, string url, object content) { 
    var json = JsonConvert.SerializeObject(content) 
    var data = new StringContent(content: json, 
       encoding: Encoding.UTF8, 
       mediaType: "application/json"); 
    return httpClient.PostAsync(url, data); 
} 
Смежные вопросы