繁体   English   中英

如何发布和投射有效载荷?

[英]How to post and cast payload?

我的目标是调用 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 端点被命中,有效负载不为空并且强制转换有效。 为什么? 以及如何解决?

从同一解决方案调用时的有效负载尝试/捕获开始

顺便说一句。 如何通过邮递员拨打这个电话?

问候

此行告诉模型绑定器将request中任何匹配属性的值设置为传递给 API 的值:

public IHttpActionResult Prepare(NbRequestBase request)

模型绑定器不会将所有其他属性附加到请求中,因为它不知道它们会是什么。

问题是程序集名称,其中控制台应用程序中的 NbRequestConcrete 位于一个程序集中,而 API 位于另一个程序集中。 所以要求不同。

{
  "$type": "Nb.NbRequestConcrete, Tester",
  "ConcreteProp": "ConcreteProp",
  "BaseProp": "BaseProp"
}

VS

{
  "$type": "Nb.NbRequestConcrete, MYApi",
  "ConcreteProp": "ConcreteProp",
  "BaseProp": "BaseProp"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM