我的目标是调用api(通过post),接受有效负载作为基本类型,然后将其转换为具体类型。如果我从主解决方案(我的api所在的地方)这样做,一切都工作得很好。但是我不明白为什么同样的代码在其他解决方案中不起作用。
所以我有我的请求(声明在不同的解决方案)
namespace Nb
{
public class NbRequestBase
{
public string BaseProp { get; set; }
}
public class NbRequestConcrete : NbRequestBase
{
public string ConcreteProp { get; set; }
}
}
这是我的端点:
[HttpPost]
[Route("payments/nb")]
public IHttpActionResult Prepare(NbRequestBase request)
{
if(request is NbRequestConcrete)
{
}
try
{
// <<< INSERT CODE HERE >>>
NbRequestConcrete nbRequestConcrete = (NbRequestConcrete)request;
return Ok();
}
catch (Exception ex)
{
_logger.Error(ex);
return InternalServerError();
}
}
这是我的呼叫代码:
NbRequestConcrete requestTwo = new NbRequestConcrete()
{
BaseProp = "BaseProp",
ConcreteProp = "ConcreteProp"
};
using (var client = new HttpClient())
{
var _clientId = "_clientId";
var _clientSecret = "_clientSecret";
client.BaseAddress = new Uri("http://localhost:50228");
#region Formatter
JsonMediaTypeFormatter formatter = new JsonMediaTypeFormatter();
formatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
List<MediaTypeFormatter> formatters = new List<MediaTypeFormatter>();
formatters.Add(formatter);
#endregion
var responseMessage = client.PostAsync($"payments/nb?clientId={_clientId}&clientSecret={_clientSecret}", requestTwo, formatter).Result;
responseMessage.EnsureSuccessStatusCode();
}
如果我把我的调用代码放到其他项目/解决方案中(例如只是一个新的控制台应用程序),API端点被击中,但有效载荷是空的。
调用时的有效负载
如果我将完全相同的调用代码放入我的api所在的项目中(例如在相同的api端点方法中,在try/catch块开始并再次调用它),api端点被击中,有效载荷不为空并且铸造工作。为什么呢?如何解决这个问题?
从相同的解决方案调用时的有效负载try/catch start
,顺便说一句。如何通过邮差打这个电话?
对
这一行告诉模型绑定器将request
中任何匹配属性的值设置为传递给API的值:
public IHttpActionResult Prepare(NbRequestBase request)
模型绑定器没有将所有其他属性附加到请求中,因为它不知道它们是什么。
问题是程序集名称,其中NbRequestConcrete在控制台应用程序中位于一个程序集中,而API位于另一个程序集中。所以请求是不同的
{
"$type": "Nb.NbRequestConcrete, Tester",
"ConcreteProp": "ConcreteProp",
"BaseProp": "BaseProp"
}
和
{
"$type": "Nb.NbRequestConcrete, MYApi",
"ConcreteProp": "ConcreteProp",
"BaseProp": "BaseProp"
}