gpt4 book ai didi

c# - WebAPI 2 [FromBody] 参数未设置

转载 作者:太空狗 更新时间:2023-10-30 00:30:32 25 4
gpt4 key购买 nike

我有一个应该是非常基本的场景......我觉得我之前已经做过 100 次但由于某种原因它决定不工作并将我的时间浪费在一些琐碎的事情上......

我正在使用带有属性路由的 WebAPI(喜欢它们)。

我试图传入两个参数,一个来自 Body,一个来自 Uri。它们都是基本类型……一个是Boolean,另一个是Long sponsorID。

非常简单的服务签名...

[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 和 Advanced REST Client 以及 JQuery/Chrome 我一直收到“Bad Request”错误...

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

我收到以下错误...

The parameters dictionary contains a null entry for parameter 'enabled' of non-nullable type 'System.Boolean' for method 'System.Net.Http.HttpResponseMessage EnableSponsorBanner(Boolean, Int64)' in 'WEB.Admin.api.SponsorAPIController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."

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

我正在用头撞墙……有什么想法吗?

解决方案

我尝试简单地从 Web 服务调用中删除 key ,但没有成功。相反,我创建了一个数据传输对象 (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 而不是对象......(我怀疑的另一篇文章...... - 叹息)

var request = function () {

$.ajax({
type: 'PUT',
url: 'http://localhost/adminAPI/Sponsor/23/Enable',
data: { "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) {
});
};

注意解决方案

我发现仅将 JSON 对象作为数据负载发送是行不通的。我必须对数据进行“字符串化”,以便将其序列化回 APIValueTypes 参数数据类型。所以从 JQuery 调用服务现在看起来像...注意 data 赋值...

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 个月后忘记它时,这篇文章仍然会在这里提醒我!!再次感谢!

最佳答案

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

您的 ASP.Net Web API 需要原始类型,但您发送的是对象 { enabled: true } 然后它不会将其绑定(bind)到您的 enabled 参数不是对象。

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

data: { "": true }

请注意属性名称为空,这将告诉 jQuery 以这种格式发送数据 =true。使用这种格式,ASP.Net Web API 可以将其绑定(bind)到您的 bool 参数。

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

关于c# - WebAPI 2 [FromBody] 参数未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com