3

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

任何帮助,将不胜感激。

谢谢。

4

7 回答 7

21

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

[HttpPost]
public void Post()
{
    string body = Request.Content.ReadAsStringAsync().Result;
}
于 2012-11-08T16:03:41.470 回答
2

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

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

网络接口:

[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"}]}}
于 2013-01-24T02:28:51.663 回答
1

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

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

[HttpPost]
public void Post([FromBody]string buffer)
{
    // Some code goes here
}
于 2012-11-08T08:32:35.383 回答
0

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

于 2012-11-08T07:41:51.757 回答
0

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

于 2012-11-08T09:09:45.877 回答
0

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

public void Post(HttpPostedFileBase buffer)
于 2012-11-09T06:19:48.923 回答
0

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

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

后:

public async Task<IHttpActionResult> MyControllerName([FromUri] List<string> id)
于 2021-03-16T03:50:04.060 回答