我正在通过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。有一件事让我注意到了控制台应用程序调试屏幕..参见下图:
在控制台应用程序中,实际的客户端变量为null,但是JsonConvert能够将其序列化为某些内容。那是什么呢?
答案 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]
答案 1 :(得分:0)
您不会相信这一点,但是最终导致在Web Api post参数中IdentityServer.Models.Client为null的原因是因为该类用[DebuggerDisplay(“ {ClientId}”))装饰,所以我做到了没有在我的测试应用程序中提供ClientId,因此实际上它确实存在整个时间时,它始终显示为null。我很高兴这个问题在我身后,但是我对这个“功能”感到非常生气。