WebAPI文件发布在测试和部署中的处理方式不同

时间:2019-06-18 22:32:35

标签: aws-lambda asp.net-core-webapi

我正在使用WebAPI,一个端点收到一个文件。该文件只是作为文本读取,并经过处理将对象推送到DB,而从未在本地写入。这是我第一次处理文件发布,因此我可能丢失了一些内容,但我不了解所得到的行为。

我有两个测试文件,一个很小,一个更大。当我运行单元测试以读取本地文件并将其发布到http时,这两个文件都可以正常运行,并且可以完成预期的工作。当我将它们发布到AWS Lambda上的已部署服务时,较小的可以运行,但是较大的返回错误请求。

这很奇怪,它返回的错误请求来自数据分析部分。这意味着它已通过初始检查,并且数据正在通过。但是,当进行分析时,它是不正确的,因此它正在获取数据,但是所获取的数据与我的单元测试不同...

这是控制器端点:

    public async Task<ActionResult<string>> CreateMaster()
    {
        if (!Request.HasFormContentType)
        {
            return BadRequest("No form data received");
        }

        if (Request.Form.Count != 1)
        {
            return BadRequest(
                              $"Must pass one and only one form, received {Request.Form.Count}: {JsonConvert.SerializeObject(Request.Form)}");
        }

        if (Request.Form.Files.Count != 1)
        {
            return BadRequest($"Only one file is currently supported, received {Request.Form.Files.Count}");
        }

        var customerId = this.GetCurrentCustomerId();
        var userId = this.GetCurrentUserId();
        var sessionId = this.GetCurrentSessionId();

        var file = Request.Form.Files[0];
        var name = Path.GetFileNameWithoutExtension(file.FileName);

        string textData;
        using (var sr = new StreamReader(file.OpenReadStream()))
        {
            textData = await sr.ReadToEndAsync().ConfigureAwait(false);
        }

        AwsProject project;

        try
        {
            project = await _service.CreateMasterAsync(
                                                       customerId,
                                                       name,
                                                       new List<string>(),
                                                       new List<CollaborateData>(),
                                                       textData,
                                                       userId,
                                                       sessionId).ConfigureAwait(false);
        }
        catch (InvalidDataException)
        {
            return BadRequest(
                              "Keynote data is not valid, please open this file in Keynote Manager and remove any errors before uploading as a master.");
        }

        return CreatedAtAction(nameof(GetProjectById), new { projectId = project.ID }, project);
    }

这是单元测试:

    [Fact]
    public async Task CreateMaster_From_File_Returns_Created_When_Data_Valid()
    {
        var testHttpClient = await _testDataProvider.GetDefaultHttpClient(SoftwareCodes.KeynoteManager).ConfigureAwait(false);
        var httpClient = testHttpClient.Client;

        var form = new MultipartFormDataContent();
        HttpContent content = new StringContent("file");
        form.Add(content, "file");

        const string SampleFile = "RD.WebApi.UnitTests.TestDatas.SampleKeynotesLarge.txt";

        var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(SampleFile);

        content = new StreamContent(stream);
        content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "file",
                FileName = $"{TestData.ProjectName}.txt"
            };
        form.Add(content);

        var response = await httpClient.PostAsync(new Uri($"api/v1/project/master/file", UriKind.Relative), form).ConfigureAwait(false);

        await AssertX.HttpStatusCode(HttpStatusCode.Created, response).ConfigureAwait(false);

        var master = await response.Content.ReadAsAsync<AwsProject>().ConfigureAwait(false);

        Assert.NotNull(master);

        // Can't check the customer master info here because the main test customer could be overwritten
        // Need to use a separate test that creates a new customer and uses the admin client
        Assert.Equal(TestData.CustomerId, master.CustomerID);
        Assert.Equal(TestData.ProjectName, master.Name);
        Assert.Empty(master.MasterID);
    }

返回的“错误请求”消息是“主题数据无效...”消息,因此消息可以正常显示,但是“ CreateMasterAsync”内部的验证程序无法对其进行验证(同样,我可以可以使用相同的验证器在本地和单元测试中验证数据,如果这些数据全部到达那里,则肯定可以通过,因此它一定不能完整地到达那里。

服务器上是否有可能使数据混乱或被截断的东西?

修改 原来这是一个编码问题。我上载的文件是Unicode编码,由于我尝试的ASCII文件可以正常工作,因此我假设它是以ASCII读取的。一旦我告诉端点流读取器读取Unicode,问题就几乎消失了。如果有人知道为什么会这样,我在another question上发布的内容仍然有些奇怪……

我仍然不明白为什么单元测试可以正确识别Unicode编码,但最终服务器也不能。

0 个答案:

没有答案