Я работаю над WebAPI, и одна конечная точка получает файл сообщения. Файл просто читается как текст и обрабатывается для отправки объектов в БД, а не записывается локально. Это первый раз, когда я обращаюсь с файловыми сообщениями, поэтому я, вероятно, что-то упускаю, но я не понимаю, какое поведение я получаю.
У меня есть два тестовых файла, один очень маленький, а другой больше. Когда я запускаю модульные тесты, чтобы прочитать локальный файл и отправить его на 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);
}
Возвращаемое сообщение «Неверный запрос» - это сообщение «Keynote Data not valid ...», поэтому все нормально, но валидатор внутри CreateMasterAsync не проверяет его (опять же, я могу проверять данные локально и в модульных тестах, используя один и тот же валидатор, и, если они все туда попадают, они обязательно проходят, поэтому они не должны быть там целыми).
Есть ли что-то, что могло бы испортить или, возможно, усечь данные или что-то на сервере?
Редактировать
Это оказалось проблемой кодирования. Файлы, которые я загружал, были в кодировке Unicode, и он читал их, я полагаю, как ASCII, так как файл ASCII, который я пробовал, работал нормально. Как только я сказал читателю конечной точки читать Unicode, проблема почти исчезла. Есть еще небольшая странность, которую я отправил в другой вопрос , если кто-нибудь знает, почему это происходит ...
Я до сих пор не понимаю, почему модульные тесты правильно распознают кодировку Unicode, но и конечный сервер тоже не будет.