Web API: FromBody always null

本文关键字:always null FromBody API Web | 更新日期: 2023-09-27 18:13:27

我正在尝试开发一个web API,当我测试POST方法时,body总是null。当发送请求时,我已经尝试了所有方法:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:1748/api/SomeAPI");
req.Method = "post";;
var aaa = Encoding.Default.GetBytes("Test");
req.ContentType = "application/xml";
req.ContentLength = aaa.Length;
req.GetRequestStream().Write(aaa, 0, aaa.Length);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
using (System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream())) {
    Console.WriteLine(sr.ReadToEnd());
}

我使用了一个断点,API被正确调用,但是主体成员总是空的:

[HttpPost]
public void Post([FromBody]String test) {
}

Web API: FromBody always null

try

[HttpPost]
public void SomeApi()
{
   var test = HttpContext.Current.Request.Form["Test"];
}

如果你发送正确的值,这将工作100%

您的Content Type设置为XML,因此您必须将数据作为XML传递。这意味着将数据包装在<string>元素中。

我建议使用RestSharp (http://restsharp.org/)从。net调用WebAPI。

        var client = new RestClient("http://localhost:1748/");
        var request = new RestRequest("api/SomeAPI", Method.POST);
        request.AddBody("Test");
        var response = client.Execute(request);

我已经创建了一个示例项目,它工作得非常好:

服务器端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
namespace WebApplication1.Controllers
{
    public class HomeController : ApiController
    {
        [Route("api/TestAPI")]
        [HttpPost]
        public IHttpActionResult Post([FromBody]String test)
        {
            return Ok(string.Format("You passed {0}.", test));
        }
    }
}
客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:1748/api/TestAPI");
            req.Method = "post"; ;
            var aaa = Encoding.Default.GetBytes("'"Test'"");
            req.ContentType = "application/json";
            req.ContentLength = aaa.Length;
            req.GetRequestStream().Write(aaa, 0, aaa.Length);
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            using (System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream()))
            {
                Console.WriteLine(sr.ReadToEnd());
            }
        }
    }
}

在IIS中安装WEB API服务并运行控制台应用程序后,它打印:

"You passed Test."

请注意回复周围的引号。如果你想使用XML,那么你需要修改你发送的内容类型和数据:

var aaa = Encoding.Default.GetBytes("<string xmlns='"http://schemas.microsoft.com/2003/10/Serialization/'">Test</string>");

您将得到的响应是

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You passed Test.</string>

调试器中的两个示例都将在测试参数中传递正确的值。

可以尝试两件事:首先,使用Postman等久经考验的工具来尝试您的请求。这将消除您的请求以任何方式出现错误的可能性。第二,试着把你的ContentType改成text/plain。有可能请求管道看到的是application/xml,但你的请求体是无效的xml,这真的应该是一个糟糕的请求,但只是被序列化为空。