【问题标题】:ASP.NET WebApi not receiving post dataASP.NET WebApi 未接收到发布数据
【发布时间】:2021-03-16 11:50:04
【问题描述】:

我需要使用 WebApi 接收一些字符串和二进制数据。我以这种方式创建了一个控制器:

    [HttpPost]
    public void Post(byte[] buffer)
    {
        // Some code goes here
    }

这是路由:

    routes.MapHttpRoute(
        name: "CuscarD95B",
        routeTemplate: "D95B/{controller}",
        defaults: new { buffer = RouteParameter.Optional },
        constraints: new { controller = @"Cuscar" }

现在,当我尝试发布一些数据时,缓冲区始终为 byte[0](零长度数组)。没有数据被传递给控制器​​。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: c# .net asp.net-mvc rest asp.net-web-api


    【解决方案1】:

    如果您曾经为反序列化正文而苦苦挣扎,请尝试手动执行,看看您是否真的正确发送了它。

    [HttpPost]
    public void Post()
    {
        string body = Request.Content.ReadAsStringAsync().Result;
    }
    

    【讨论】:

    • 为那个小宝石+1。我在传递正文中的原始文本(通过 Fiddler2)并让FromBody 看到它时遇到了无穷无尽的问题,但是您的 sn-p 挽救了这一天。干杯
    【解决方案2】:

    我们通过 HttpPost 方法传递 Json 对象,并在动态对象中解析它。它工作正常。这是示例代码:

    ajaxPost:
    ...
    Content-Type: application/json,
    data: {"name": "Jack", "age": "12"}
    ...
    

    网络 API:

    [HttpPost]
    public string DoJson2(dynamic data)
    {
        string name = data.name;
        int age = data.age;
    
        return name;
    }
    

    如果有复杂的对象类型,需要解析动态类型:

    JsonConvert.DeserializeObject< YourObjectType >(data.ToString());
    

    这里有一个复杂的数据内容示例,它包括数组和字典对象:

    {"AppName":"SamplePrice","AppInstanceID":"100","ProcessGUID":"072af8c3-482a-4b1c‌​-890b-685ce2fcc75d","UserID":"20","UserName":"Jack","NextActivityPerformers":{"39‌​c71004-d822-4c15-9ff2-94ca1068d745":[{"UserID":10,"UserName":"Smith"}]}}
    

    【讨论】:

      【解决方案3】:

      我能够在我的请求正文中发布一个字节[],并且该值已成功绑定模型。是否设置了内容类型?请注意,简单字符串在这里被认为是有效的 JSON,因此如果您的请求的内容类型设置为 application/json...

      话虽如此,您可以简单地让您的 POST 方法期望正文中的字符串而不是 byte[] 并将内容类型设置为 application/json:

      [HttpPost]
      public void Post([FromBody]string buffer)
      {
          // Some code goes here
      }
      

      【讨论】:

      • 谢谢 Maggie,我尝试将 content-type 设置为 application/json 但缓冲区为空:|。
      • 可以分享您尝试发送的 byte[] 内容吗?
      【解决方案4】:

      我不确定如何将byte[] 发送到webApi,但您可以将二进制数据作为Base64 string 传递给您的控制器,然后将base64 string 转换为byte[]

      【讨论】:

      • 嗯,是否可以只向 webapi 发送字符串?不是 xml 或 json,一些非结构化的字符串数据。谢谢
      • 您有任何通过 POST 将纯字符串参数传递给 ApiController 的工作示例吗?我找不到任何东西。谢谢
      【解决方案5】:

      我找到了解决方案here。 看起来我们需要创建自定义 MediaTypeFormatter 来实现原始类型反序列化。

      【讨论】:

        【解决方案6】:

        您是否尝试在没有[FromBody] 的情况下使用 HttpPostedFileBase ?

        public void Post(HttpPostedFileBase buffer)
        

        【讨论】:

          【解决方案7】:

          我遇到过类似的情况,我使用的是字符串数组,它总是会通过 null 或者我会收到格式不正确的请求的异常。我在我的方法参数中添加了注释[FromUri] 然后它起作用了。为了提供更多上下文,我的控制器方法之前看起来像这样:

          public async Task<IHttpActionResult> MyControllerName(List<string> id)
          

          之后:

          public async Task<IHttpActionResult> MyControllerName([FromUri] List<string> id)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-25
            • 2015-11-28
            • 1970-01-01
            相关资源
            最近更新 更多