ASP.NET WebApi不接收帖子数据

时间:2012-11-08 07:31:34

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

我需要使用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](零长度数组)。没有数据传递给控制器​​。

任何帮助将不胜感激。

感谢。

7 个答案:

答案 0 :(得分:20)

如果您一直在努力反序列化身体,请尝试手动执行以查看您是否实际正在正确发送它。

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

答案 1 :(得分:2)

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

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

的WebAPI:

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

    return name;
}

如果存在complext对象类型,则需要使用以下方法解析动态类型:

<强> JsonConvert.DeserializeObject&LT; YourObjectType&gt;(data.ToString());

这里有一个复杂的数据内容示例,它包括数组和字典对象。 { “AppName的”: “SamplePrice”, “AppInstanceID”: “100”, “ProcessGUID”: “072af8c3-482a-4b1c -890b-685ce2fcc75d”, “用户ID”: “20”, “用户名”: “杰克”, “NextActivityPerformers”:{ “39 c71004-d822-4c15-9ff2-94ca1068d745”:[{ “用户ID”:10 “用户名”: “史密斯”}]}}

答案 2 :(得分:1)

我能够在我的请求体中发布一个byte [],并且该值已成功绑定模型。内容类型设置了吗?请注意,简单的字符串在这里被认为是有效的JSON,因此如果您的请求的content-type设置为application / json,它应该可以工作...

话虽如此,你可以简单地让你的POST方法需要来自body的字符串而不是byte [],并将content-type设置为application / json:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

public void Post(HttpPostedFileBase buffer)

答案 6 :(得分:0)

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

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

之后:

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