我正在使用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编码,但最终服务器也不能。