【问题标题】:HttpPost does not get ContentLength from PostAsync requestHttpPost 没有从 PostAsync 请求中获取 ContentLength
【发布时间】:2018-07-27 10:22:06
【问题描述】:

我有一个向 HttpPost 方法发送请求的单元测试代码。

[Test]
public async Task ValidateToken()
{
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string("test", "test")
    };
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
    var response = await httpClient.PostAsync("/api/token/1", content);
    Assert.AreEqual(HttpStatusCode.Accepted, response.StatusCode);
}

[Route("api/token")]
public class MyController : BaseApiController
{
    private readonly HttpRequest httpRequest;
    public MyController(IHttpContextAccessor httpContextAccessor)
    {
        httpRequest = httpContextAccessor.HttpContext.Request;
    }

    [HttpPost("{count}")]
    public async Task<IActionResult> Post(int count)
    {
        if(httpRequest.ContentLength)
            return BadRequest();
        else
            return Accepted();

        var success= await store.SaveLogStreamAsync(httpRequest.Body, count);
        return success ? Accepted() : InternalServerError();
    }
}

此单元测试总是失败,因为httpRequest.ContentLength 为空。但是,当我在这一行下断点并检查contentContentLength时,它总是大于0。

var response = await httpClient.PostAsync("/api/token/1", content);

另外,当我在到达 Action 方法之前设置断点时,ContentLength 不再为 0。我在想,发送内容有延迟吗?

编辑:

我发现,在通过单元测试进行测试时,httpRequest.Body 的类型为 MemoryStreamhttpRequest.ContentLength = null

当从 Postman 发送请求时,httpRequest.Body 的类型为 FrameRequestStreamhttpRequest.ContentLength 始终有一个值。

【问题讨论】:

    标签: c# unit-testing asynchronous async-await .net-core


    【解决方案1】:

    您可以通过以下方式检查请求:

      var length= Request.Content.Headers.ContentLength ;
    

    不知道httpRequest 变量来自哪里

    【讨论】:

    • 我加了代码看看httpRequest是从哪里来的
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2013-08-15
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多