我需要使用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](零长度数组)。没有数据传递给控制器。
任何帮助将不胜感激。
感谢。
答案 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)