自从升级到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安装


当前回答

在WebAPI中传递一个参数是正确的。post(url, {": productId}

并在行动中捕捉它[HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]字符串值)

关键是要使用“价值”这个神奇的词。它也可以是int型,或者一些基本类型。 无论是内容类型还是标题更正 混乱是这段代码不能在mvc post action中工作。

其他回答

API:

[HttpPost]
public bool UpdateTicketStatus(Ticket t)
{    
    string Id=t.Id;
}

模型:

public class Ticket
{
    public int Id { get; set; }
    public string AssignedTo { get; set; }
    public string State { get; set; }
    public string History { get; set; }
}

使用Post man工具将内容发送为json和原始数据,如下所示。它的工作原理

{ “Id”:“169248”, “AssignedTo”:“xxxx”, “状态”:“承诺”, “历史”:“test1” }

请确保您已启用Cors。

[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class TicketController : ApiController
    {
}

对我来说最好的解决方案是完全HTTP,如下所示:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

然后将字符串反序列化为post body中期望的对象。 对我来说,WS_OpenSession是一个包含会话id、用户和密钥的类。

您可以从那里使用param对象并访问它的属性。

非常非常有效。

我说的是从这个url来源的:

http://bizcoder.com/posting-raw-json-to-web-api

我有一个类似的问题,有或没有[FromBody]标签时,通过AJAX调用发送原始数据上传图像。当请求太大时,控制器会转储它(变量= null),所以解决方案是增加最大请求大小,调整图像大小或类似的方法。

增加请求大小的方法描述在这里:https://stackoverflow.com/a/16403447

在Angular中,我可以这样传递数据:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

在Web API控制器中:

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

或者,我也可以像这样发布JSON数据:

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

并且,在控制器中,接受这样的类类型:

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

两种方式都可以,如果你在API中有一个已经建立的公共类,那么就发布JSON,否则就发布'=' + JSON.stringify({..:…, . .:…})

如果您放入[FromBody]注释,并且有一个Dto对象作为方法的参数,但仍然无法获取数据,请开始查看Dto的属性和字段。

我也有同样的问题,我的DTO是空的。我发现原因是其中一个属性指向一个不能序列化的对象:(这导致媒体格式化器无法解析数据。因此对象总是空的。 希望它也能帮助到其他人