webapi参数为空

时间:2018-06-20 07:45:41

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

我正在开始WebApi教程,但是我遇到一个问题,即操作中的参数为null。

下面是教程代码。

WebApi

[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    var raw = Request.Content.ReadAsStringAsync();
    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

    IdentityResult result = await UserManager.CreateAsync(user, Result.Password);

    if (!result.Succeeded)
    {
       return GetErrorResult(result);
    }

    return Ok();
    }

WebApi客户端

static string Register(string email, string password)
{
    var Result = new RegisterBindingModel()
    {
        Email = email,
        Password = password,
        ConfirmPassword = password
    };
    using (var client = new HttpClient())
    {
        var response = client.PostAsJsonAsync(
                "http://localhost:7399/api/Account/Register",
                 Result).Result;
        return response.StatusCode.ToString();
    }
    }

Register操作接收到http请求,但是模型始终为null。因此原始变量显示如下

{"Email":"test@gmail.com","Password":"Test@123","ConfirmPassword":"Test@123"}

但是当我尝试使用Postman发送http请求时,它可以工作。读取请求主体以进行模型绑定。原始变量为空。我不知道我的客户出了什么问题。我完全遵循了教程代码。我应该指定内容类型吗?

2 个答案:

答案 0 :(得分:1)

使变量名相同,即在Register方法中将var Result更改为var model并尝试。


应为frombody,即从帖子正文获取参数值

[HttpPost]
public async Task<IHttpActionResult> Register([FromBody]RegisterBindingModel model)

答案 1 :(得分:0)

添加HttpPost并在下面的方法中使用

    [AllowAnonymous]
    [HttpPost]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
     //your code
    }

使用此方法:-

  public static async Task<HttpResponseMessage> PostAsJsonAsync(this HttpClient client,
    string requestUri, object requestObject, Dictionary<string, string> requestHeaders = null,
    int? timeoutMilliSeconds = null)
    {
      var jsonContent = JsonConvert.SerializeObject(requestObject);

      var requestContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

      return await SendAsync(client, requestUri, HttpMethod.Post,
          requestContent, requestHeaders, timeoutMilliSeconds);
    }


    public static async Task<HttpResponseMessage> SendAsync(
    this HttpClient client,
    string requestUri, HttpMethod httpMethod, HttpContent requestContent = null,
    Dictionary<string, string> requestHeaders = null, int? timeoutMilliSeconds = null)
    {
      var httpRequestMessage = new HttpRequestMessage
      {
        RequestUri = new Uri(requestUri),
        Method = httpMethod,
        Content = requestContent
      };

      if (requestHeaders != null)
      {
        foreach (var requestHeader in requestHeaders)
        {
          httpRequestMessage.Headers.Add(requestHeader.Key, requestHeader.Value);
        }
      }

      if (timeoutMilliSeconds.HasValue)
      {
        var cts = new CancellationTokenSource();
        cts.CancelAfter(new TimeSpan(0, 0, 0, 0, timeoutMilliSeconds.Value));
        return await client.SendAsync(httpRequestMessage, cts.Token);
      }
      else
      {
        return await client.SendAsync(httpRequestMessage);
      }
    }