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

c# – WebAPI 2 [FromBody]参数未设置,第1张

概述我应该是一个非常基本的场景……我觉得我曾经做过100次,但由于某种原因,它决定不工作,浪费我的时间在一些微不足道的事情…… 我正在使用带有属性路由的WebAPI(喜欢它们). 我试图传递两个参数,一个来自Body,一个来自Uri.它们都是基本类型……一个是布尔值,另一个是长期赞助商ID. 非常简单的服务签名…… [HttpPut][Route("adminAPI/sponsors/{sponso 我应该是一个非常基本的场景……我觉得我曾经做过100次,但由于某种原因,它决定不工作,浪费我的时间在一些微不足道的事情……

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

我试图传递两个参数,一个来自Body,一个来自Uri.它们都是基本类型……一个是布尔值,另一个是长期赞助商ID.

非常简单的服务签名……

[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;}

使用邮差和高级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,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]参数未与请求一起传递,从而导致错误.当我使参数为nullable时,请求会通过但是,正如预期的那样,enabled参数是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而不是对象…(我怀疑的另一篇文章… – 叹气)

var request = function () {    $.AJAX({        type: 'PUT',url: 'http://localhost/adminAPI/Sponsor/23/Enable',data: { "booleanValue": false },ContentType: "application/Json",})    .done(function (data,jqXHR) {        console.log(data);        if ([200,errorThrown) {    });};

CAVEAT解决方案

我发现简单地发送JsON对象作为数据有效负载是行不通的.我必须“字符串化”数据,以便将其序列化回APIValueTypes参数数据类型.所以从Jquery调用服务现在看起来像…注意数据分配……

var request = function () {    $.AJAX({        type: 'PUT',data: JsON.stringify({ "booleanValue": false }),errorThrown) {    });};

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

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

您的ASP.Net Web API需要一个原始类型,但您发送一个对象{enabled:true}然后它不会将它绑定到您不是对象的已启用参数.

要使其工作,您必须使用以下代码作为jquery AJAX请求中的数据:

data: { "": true }

请注意,属性名称为空,这将告诉jquery以此格式发送数据= true.使用该格式,ASP.Net Web API可以将其绑定到您的布尔参数.

要防止该问题,请始终使用viewmodel.

总结

以上是内存溢出为你收集整理的c# – WebAPI 2 [FromBody]参数未设置全部内容,希望文章能够帮你解决c# – WebAPI 2 [FromBody]参数未设置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存