在ASP.NET Core 2.x中,IdentityServer4.Models.Client作为httppost参数始终为null

时间:2018-07-04 16:28:05

标签: c# asp.net-core identityserver4 asp.net-core-webapi

我正在通过C#控制台应用程序将类型为IdentityServer4.Models.Client的httpPost参数“ client”发送到C#Web api,并且 client始终为空

如果我使用相同的代码发送另一个对象,则可以很好地接收参数。这似乎是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());
            }
        }
    }

编辑 应用[FromBody]并展开对象后,接收Web API中的客户端仍然为null。有一件事让我注意到了控制台应用程序调试屏幕..参见下图:

enter image description here

在控制台应用程序中,实际的客户端变量为null,但是JsonConvert能够将其序列化为某些内容。那是什么呢?

2 个答案:

答案 0 :(得分:1)

您将模型包装在一个匿名对象中,这会将其JSON表示形式转换为与原始import os os.system('ls -l') 类没有任何共同之处。

此:

Client

将产生类似于以下内容的JSON:

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

var json = JsonConvert.SerializeObject(client);

但是您真正想要的只是{ "client": { "clientName": "foo", "anotherProperty": "bar", // other properties omitted for brevity } } 对象:

Client

请勿包装您的{ "clientName": "foo", "anotherProperty": "bar", // other properties omitted for brevity } ,只需直接对其进行序列化即可遵循MVC操作方法中的模型:

clientData

要使所有功能正常运行,您必须明确告知模型绑定程序期望数据在何处。

在模型上使用var clientData = new IdentityServer4.Models.Client(); clientData.ClientName = clientName; var json = JsonConvert.SerializeObject(clientData); 属性。

  

[FromBody]:使用配置的格式化程序绑定请求正文中的数据。根据请求的内容类型选择格式化程序。

[FromBody]

引用Model Binding in ASP.NET Core

答案 1 :(得分:0)

您不会相信这一点,但是最终导致在Web Api post参数中IdentityServer.Models.Client为null的原因是因为该类用[DebuggerDisplay(“ {ClientId}”))装饰,所以我做到了没有在我的测试应用程序中提供ClientId,因此实际上它确实存在整个时间时,它始终显示为null。我很高兴这个问题在我身后,但是我对这个“功能”感到非常生气。