C# 未设置WebAPI 2[FromBody]参数

C# 未设置WebAPI 2[FromBody]参数,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个非常基本的场景。。。我觉得我已经做了100次了,但出于某种原因,它决定不工作,把我的时间浪费在一些琐碎的事情上 我将WebAPI与属性路由一起使用(喜欢它们) 我试图传入两个参数,一个来自主体,另一个来自Uri。它们都是基本类型。。。一个是布尔型的,另一个是长型的 非常简单的服务签名 [HttpPut] [Route("adminAPI/sponsors/{sponsorID:long}/Enable")] public HttpResponseMessage EnableSponsor

我有一个非常基本的场景。。。我觉得我已经做了100次了,但出于某种原因,它决定不工作,把我的时间浪费在一些琐碎的事情上

我将WebAPI与属性路由一起使用(喜欢它们)

我试图传入两个参数,一个来自主体,另一个来自Uri。它们都是基本类型。。。一个是布尔型的,另一个是长型的

非常简单的服务签名

[HttpPut]
[Route("adminAPI/sponsors/{sponsorID:long}/Enable")]
public HttpResponseMessage EnableSponsor([FromBody]Boolean enabled, [FromUri] Int64 sponsorID)
{
    HttpResponseMessage ret = null;
    // does stuff and populates the response
    return ret;
}
使用Postman和高级REST客户端以及JQuery/Chrome,我一直收到“错误请求”错误

var request = function () {

    $.ajax({
        type: 'PUT',
        url: 'http://localhost:50865/adminAPI/Sponsor/23/Enable',
        data: { "enabled": true },
        contentType: "application/json"
    })
    .done(function (data, textStatus, jqXHR) {

        if ([200, 204, 304].indexOf(data.StatusCode) === -1) {

        } else {

        }
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
    });
};
我得到以下错误

参数字典包含参数的空条目 方法的“System.Boolean”类型为非Null的“enabled” 'System.Net.Http.HttpResponseMessage EnableSponsorBanner(布尔, Int64)“在”WEB.Admin.api.SponsorAPIController“中”。可选参数 必须是引用类型、可为null的类型或声明为 可选参数。“

由于某些原因,[FromBody]参数未随请求一起传递,导致错误。当我将参数设置为NULL时,请求将通过,但正如预期的那样,启用的参数为NULL

我的头撞在墙上……有什么想法吗

解决方案

我试图简单地从Web服务调用中删除密钥,但没有成功。相反,我创建了一个数据传输对象(DTO),其中包含我可能单独发送给服务的基本数据类型。我可以使用它来传递此模型,以传递此请求和将来任何其他请求的简单值引用

//
// The Data Transfer Object
    public class APIValueTypes
    {
        public Boolean booleanValue { get; set; }

        public Int64 longValue { get; set; }

        public String stringValue { get; set; }

        public DateTime dateValue { get; set; }
    }
因为服务知道它在寻找什么价值,所以它可以获取它所需要的任何价值

[HttpPut]
[Route("adminAPI/sponsors/{sponsorID:long}/Enable")]
public HttpResponseMessage EnableSponsor([FromBody]APIValueTypes enabled, [FromUri] Int64 sponsorID)
{
    HttpResponseMessage ret = null;
    Boolean isEnabled = enabled.booleanValue;
    // does stuff and populates the response
    return ret;
}
警告

不过,我必须承认,虽然我在REST工具中使用它,但我无法在我的JQuery实现中使用它。因此,虽然我的帖子得到了回复,但我对JQuery ajax$还有另一个问题……即使我将DTO发送到对象,服务方法仍然会接收null而不是对象。。。(我怀疑是另一个帖子…-叹气)

警告解决方案

我发现简单地将JSON对象作为数据有效负载发送是不起作用的。我必须“字符串化”数据,以便将其序列化回APIValueTypes参数数据类型。因此,JQuery对服务的调用现在看起来像……注意数据赋值

var request = function () {

    $.ajax({
        type: 'PUT',
        url: 'http://localhost/adminAPI/Sponsor/23/Enable',
        data: JSON.stringify({ "booleanValue": false }),
        contentType: "application/json",

    })
    .done(function (data, textStatus, jqXHR) {

        console.log(data);

        if ([200, 204, 304].indexOf(data.StatusCode) === -1) {

        } else {

        }
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
    });
};

我希望有人能发现这段小小的旅程很有用,当我在6个月后忘记它时,这篇文章也会在这里提醒我!!再次感谢!

我也遇到了同样的问题,我从请求中删除了密钥,并将其设置在我的变量中

只需按如下方式删除已启用的:

var request = function () {
$.ajax({
    type: 'PUT',
    url: 'http://localhost:50865/adminAPI/Sponsor/23/Enable',
    data: { "": true },
    contentType: "application/json"
})
.done(function (data, textStatus, jqXHR) {

    if ([200, 204, 304].indexOf(data.StatusCode) === -1) {

    } else {

    }
})
.fail(function (jqXHR, textStatus, errorThrown) {
});
})

或者,您可以创建如下模型:

    public class Model
    {
        public bool Enabled { get; set; }
    }
然后:

[HttpPut]
[Route("adminAPI/sponsors/{sponsorID:long}/Enable")]
public HttpResponseMessage EnableSponsor([FromBody]Model model, [FromUri] Int64 sponsorID)
{
    HttpResponseMessage ret = null;
    // does stuff and populates the response
    return ret;
}

希望,它适用于u.

您有这个问题,因为您没有以ASP.Net Web API预期的格式发送数据。ASP.Net Web API在处理字符串和值类型(int、bool等)等值时需要一些特殊格式,参数用
FromBody
属性标记

您的ASP.Net Web API需要一个primitive类型,但是您正在发送一个对象
{enabled:true}
,那么它将不会将它绑定到您的
enabled
参数,该参数不是对象

要使其正常工作,必须在jQuery ajax请求中使用以下代码作为数据:

data: { "": true }
请注意,属性名为空,这将告诉jQuery以这种格式发送数据
=true
。使用这种格式,ASP.Net Web API可以将其绑定到布尔参数


为防止出现此问题,请始终使用ViewModel。

这也可能有效…虽然我的REST工具中有解决方案,但我仍然无法通过JQuery(?)使其正常工作-这只是一个问题到下一个问题。我一直在与[FromBody]处理类似的问题属性,发现您关于字符串化JSON的评论似乎是我在尝试将数据填充到该参数时遇到的唯一问题。感谢您阐明了这个小细节。
data: { "": true }