Web API:FromBody始终为null

时间:2016-10-16 22:00:41

标签: c# asp.net-web-api

我正在尝试开发一个web api,当我测试post方法时,body总是为null。我在发送请求时尝试了所有内容:

export NPM_USERNAME=mUs34
export NPM_PASSWORD=mypassW0rD
export NPM_EMAIL=user@domain.com
npm adduser<<!
$NPM_USERNAME
$NPM_PASSWORD
$NPM_EMAIL
!

我使用断点,并且正确调用API,但是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());
        }

3 个答案:

答案 0 :(得分:0)

您的内容类型设置为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>

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

答案 1 :(得分:0)

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

如果你正确发送了这个值,这将100%

答案 2 :(得分:-1)

要尝试两件事,第一,使用像Postman这样久经考验的工具尝试您的请求。这将消除您的请求以任何方式发生错误的任何可能性。 2,尝试将ContentType更改为text / plain。请求管道可能会看到application / xml,但是你的请求体是无效的xml,它确实应该是一个错误的请求,但只是被序列化为null。