дотнет ядро ​​webapi, вызывающее .net webapi2 - PullRequest
0 голосов
/ 05 октября 2018

Я звоню в конечную точку .NET WebApi2 из ядра сети dotnet.Когда я отлаживаю в конечную точку .NET WebApi2 POST , мое значение всегда равно нулю.Разве это невозможно сделать?

Когда я вызываю конечную точку GET с идентификатором, идентификатор передается без проблем.

Я использовал и Postman, и Fiddler для отладки.Всякий раз, когда я передаю свой объект JSON из Postman в конечную точку .NET WebApi2 POST , мое значение заполняется .

Помимо разочарования, поскольку это кажется довольно простым.:, (

Обновлено для включения кода

dotnet core web api (звонит из Почтальона)

 [HttpPost]
    public async Task PostAsync([FromBody] string value)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var jsonObject = new JObject();
        jsonObject.Add("text", "Rich");


        var response = await client.PostAsJsonAsync("http://localhost:54732/api/Rich", jsonObject);
        var responseResult = response.Content.ReadAsStringAsync().Result;

    }

.NET WebApi2 (JObject всегда нулевой)

// POST: api/Rich
    public void Post(JObject value) 
    {

    }

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

My «REAL» проблема оказалась Transfer-Encoding: chunked отправлялся в заголовке запроса.

Вот мой исправленный код (web-интерфейс dotnet core):

 public async Task PostAsync([FromBody] JObject value)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new 
                               MediaTypeWithQualityHeaderValue("application/json"));

        var jsonObject = new { variable1 = "Rich" };


        var json = JsonConvert.SerializeObject(jsonObject);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        content.Headers.ContentLength = json.Length;
        var response = await client.PostAsync("http://localhost:54732/api/Rich", content);

        var responseResult = response.Content.ReadAsStringAsync().Result;

    }

Вот мой код .NET WebApi2:

public IHttpActionResult Post([FromBody]RichTest value)
    {
        return Ok(value.variable1 + " done");
    }

public class RichTest
{
    public string variable1 { get; set; }
}

Когда я устанавливаю содержимое.Headers.ContentLength, Transfer-Encoding: chunked удален.Теперь мой код работает !!

Мне все еще любопытно, почему оригинальный PostAsJsonAsync не работает ...

0 голосов
/ 08 октября 2018

Это сводится к использованию JObject в основном.Для вашего более старого действия Web Api JObject работает просто потому, что вы публикуете JSON, а JObject является динамическим.Однако это совершенно неверный подход.Вы должны связываться с конкретным классом, который представляет публикуемый JSON.Тем не менее, вы можете или не можете изменить что-то там, и это не технически источник вашей текущей проблемы.

Фактический источник - то, что вы пытаетесь отправитьJObject, который не делает то, что вы думаете.Опять же, JObject является динамическим.У него есть средства доступа для анализа и доступа к базовому JSON, но на самом деле он не предоставляет непосредственного доступа к членам этого объекта JSON.В результате, если вы попытаетесь его сериализовать, вы не получите от него ничего полезного.Передача его в PostAsJsonAsync вызывает сериализацию.

Что вам действительно нужно, так это:

var jsonObject = new { text = "Rich" };

Тогда то, что вы передаете в PostAsJsonAsync, будет анонимнымобъект с фактическими членами, которые можно сериализовать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...