自从升级到RC的WebAPI,我有一些真正奇怪的问题时调用POST在我的WebAPI。 我甚至回到了在新项目上生成的基本版本。所以:

public void Post(string value)
{
}

提琴手喊道:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

当我调试时,字符串“value”永远不会被赋值。它总是NULL。 有人有这个问题吗?

(我第一次看到这个问题是在一个更复杂的类型上)

这个问题不仅仅局限于ASP。在asp.net MVC 4中,同样的问题出现在一个新的ASP。NET MVC 3项目后RC安装


当前回答

我有点晚了,但是任何人在使用控制器时偶然发现一个NULL值,只要在POST请求的前面添加“=”就可以了。

当我使用application/json Content-Type时,控制器也传递了一个NULL值。注意下面的“application/x-www-form-urlencoded”内容类型。然而,API的返回类型是“application/json”。

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }

其他回答

对于那些与Swagger或Postman有相同问题的人,如果你在post中传递一个简单的属性作为字符串,即使指定了“ContentType”,你仍然会得到一个空值。

仅仅通过:

我的价值

将在控制器中获取为null。

但如果你通过了:

“我的价值”

这个值是正确的。

这里的名言起了作用。当然,这只是给斯威格和波兹曼的。例如,在使用Angular的Frontend应用中,这个问题应该由框架自动解决。

如果你在Postman的json查询中有这个字符'\',你应该转义它,如果你需要在json字符串值中使用'\'字符。

例子:

{
    "path": "C:\\Users\\Test\\Documents\\test.txt"
}

我也遇到过这个问题,这就是我解决问题的方法

webapi守则:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

客户机代码:

$.post( "webapi/address", { value: "some value" } );

JSON.stringify(…)解决了我的问题

我一直在寻找这个问题的解决方案,所以我将分享我的解决方案。

如果你发布一个模型,你的模型需要有一个空的/默认的构造函数,否则模型显然不能被创建。 重构时要小心。;)