C# 未设置WebAPI 2[FromBody]参数
我有一个非常基本的场景。。。我觉得我已经做了100次了,但出于某种原因,它决定不工作,把我的时间浪费在一些琐碎的事情上 我将WebAPI与属性路由一起使用(喜欢它们) 我试图传入两个参数,一个来自主体,另一个来自Uri。它们都是基本类型。。。一个是布尔型的,另一个是长型的 非常简单的服务签名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
[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 }