IdentityServer4.Models.Client как параметр httppost всегда равен нулю в ядре aspnet 2.x - PullRequest
0 голосов
/ 04 июля 2018

Я отправляю параметр httpPost "client" типа IdentityServer4.Models.Client через консольное приложение C # на веб-интерфейс C #, и клиент всегда имеет значение .

Если я отправляю другой объект, используя тот же код, параметр принимается просто отлично. Кажется, это проблема, характерная для Identity Server 4, и я не знаю, что происходит.

Код сервера:

[HttpPost]        
public JsonResult Post(IdentityServer4.Models.Client client){   

    return Json(new { result = true });
}

Код клиента:

private static async Task Register(string clientName){

        var controllerName = "BasicClient";             
        var basicClientApi = string.Format("http://localhost:5100/api/{0}", controllerName);
        using (var httpClient = new HttpClient()){

            var clientData = new IdentityServer4.Models.Client();
            var client = new { client = clientData };
            client.client.ClientName = clientName;

            var json = JsonConvert.SerializeObject(client);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");


            var response = await httpClient.PostAsync(basicClientApi, content);

            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine(response.StatusCode);
            }
            else
            {
                var rawResponse = await response.Content.ReadAsStringAsync();

                JObject o = JObject.Parse(rawResponse);
                Console.WriteLine(o.ToString());
            }
        }
    }

EDIT После применения [FromBody] и распаковки объекта я все еще получаю нулевое значение для клиента в принимающем веб-API. Одна вещь привлекла мое внимание к экрану отладки консольного приложения, хотя .. см. Изображение ниже:

enter image description here

Фактическая переменная клиента в консольном приложении пуста, но JsonConvert смог преобразовать ее во что-то. О чем это?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Вы не поверите этому, но в конечном итоге причина, по которой IdentityServer.Models.Client был нулевым в параметре публикации Web Api, заключалась в том, что класс украшен [DebuggerDisplay ("{ClientId}")], и я сделал Не указывайте ClientId в моем тестовом приложении, поэтому оно всегда показывалось как нулевое, хотя на самом деле БЫЛО ВСЕ ВРЕМЯ. Я рад, что этот вопрос позади, но я очень зол на эту "особенность".

0 голосов
/ 04 июля 2018

Вы помещаете вашу модель в анонимный объект, который превратит его представление JSON во что-то, что не имеет ничего общего с вашим исходным классом Client.

Это:

var clientData = new IdentityServer4.Models.Client();
var client = new { client = clientData };
client.client.ClientName = clientName;

var json = JsonConvert.SerializeObject(client);

Результатом будет JSON, подобный следующему:

{
    "client": { 
        "clientName": "foo",
        "anotherProperty": "bar",
        // other properties omitted for brevity
    }
}

Но то, что вы действительно хотите, это просто Client объект:

{ 
    "clientName": "foo",
    "anotherProperty": "bar",
    // other properties omitted for brevity
}

Не оборачивайте ваш clientData, просто сериализуйте его напрямую, чтобы следовать модели внутри вашего MVC Action Method:

var clientData = new IdentityServer4.Models.Client();
clientData.ClientName = clientName;

var json = JsonConvert.SerializeObject(clientData);

Чтобы все работало, вы должны явно указать связующему, где ожидать данные.

Использовать атрибут [FromBody] на модели.

[FromBody]: использовать настроенные средства форматирования для привязки данных из тела запроса. Форматер выбирается в зависимости от типа содержимого запроса.

[HttpPost]        
public IActionResult Post([FromBody]IdentityServer4.Models.Client client) {

    return Json(new { result = true });
}

Ссылка Связывание модели в ASP.NET Core

...