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


当前回答

在我的情况下,问题是参数是一个字符串而不是一个对象,我把参数改为Newsoft的JObject。Json,它可以工作。

其他回答

如果你确定你发送的JSON,那么你必须仔细跟踪你的API:

安装Microsoft.AspNet.WebApi.Tracing包 添加config.EnableSystemDiagnosticsTracing ();在WebApiConfig类的Register方法中。

现在查看Debug输出,您可能会发现一个无效的ModelState日志条目。

如果ModelState无效,你可以在它的Errors中找到真正的原因:

没有人能猜到这样一个例外:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

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

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

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
    {
}

如果您正在为Xml Formatter或JSON Formatter使用DataContractSerializer,则需要摆脱它。 我在我的WebApiConfig文件中有这个:

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

我简单地注释掉了jsonFormatter。UseDataContractJsonSerializer = true;并且我的输入参数不再为空。感谢《亡命之徒》给了我一个提示。

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

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

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