FromBody值为null

时间:2013-05-30 13:40:54

标签: c# asp.net-web-api http-post frombodyattribute

这是Asp.Net Webform应用程序
这是我的Apicontroller中的POST方法

public void Post([FromBody]string value)
{
}

我正在使用提琴手后期处理 我做了这样的实验。
但它没有。

问题是什么 你能帮忙吗?

我试过了,我失败了。

public void Post(MyViewModel model)
{
   string aa = model.Value;
}

public class MyViewModel
{
   public string Value { get; set; }
}

在Fiddler:

Request Body:   
Value=hakan

4 个答案:

答案 0 :(得分:20)

Fiddler中的POST正文有效负载应为:

=foo_bar

而不是:

value=foo_bar

这只是关于Web API中模型绑定的一些奇怪的事情。如果您想在POST正文有效负载中支持value=foo_bar,您可以随时编写视图模型:

public class MyViewModel
{
    public string Value { get; set; }
}

然后让您的方法将此视图模型作为参数:

public void Post(MyViewModel model)
{
    ... work with model.Value here as usual
}

答案 1 :(得分:10)

我遇到了这个问题,解决方案是:
适合Request Body格式= foo_bar,
还需要请求黑客:

Content-Type: application/x-www-form-urlencoded

答案 2 :(得分:0)

Web API Null Bug

要使默认的Post()方法起作用,来自Fiddler的POST数据必须如下所示

答案 3 :(得分:0)

我最近在WebAPI应用程序方面有过类似的经历。应用程序在我的测试环境中运行正常,但是当我们从构建服务器运行构建时,应用程序无法反序列化对象,并始终将[FromBody]之后的参数设置为null。

根本原因是web.config和packages.config指定了Json.NET 6.0.4,bin中的NuGet包是10.0.3。

模型绑定类型首先看起来像是从外面看的黑盒子。特别是因为它可以安静地返回null而没有指示什么是错误的。在测试对象序列化标题下的Microsoft page下,有一个如何测试序列化和反序列化的示例:

string Serialize<T>(MediaTypeFormatter formatter, T value)
{
    // Create a dummy HTTP Content.
    Stream stream = new MemoryStream();
    var content = new StreamContent(stream);
    /// Serialize the object.
    formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();
    // Read the serialized string.
    stream.Position = 0;
    return content.ReadAsStringAsync().Result;
}

T Deserialize<T>(MediaTypeFormatter formatter, string str) where T : class
{
    // Write the serialized string to a memory stream.
    Stream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(str);
    writer.Flush();
    stream.Position = 0;
    // Deserialize to an object of type T
    return formatter.ReadFromStreamAsync(typeof(T), stream, null, null).Result as T;
}

// Example of use
void TestSerialization()
{
    var value = new Person() { Name = "Alice", Age = 23 };

    var xml = new XmlMediaTypeFormatter();
    string str = Serialize(xml, value);

    var json = new JsonMediaTypeFormatter();
    str = Serialize(json, value);

    // Round trip
    Person person2 = Deserialize<Person>(json, str);
}

当我将上述代码放入我的应用程序并运行它时,Visual Studio在serialize和deserialize函数中引发了异常。例外情况明确指出,加载Json.net版本6.0.4失败了。这让我发现版本10.0.3在bin而不是6.0.4。我在上下文菜单中点击了项目点击管理NuGet包...。然后删除并重新添加Json.net NuGet包。这样做可以在bin中设置Json.net NuGet包,并使用匹配的版本号更新packages.config和web.config。