Как сделать метод запроса и ответа для REST API, который обрабатывает файлы в asp.net? - PullRequest
0 голосов
/ 17 мая 2019

Как сервер, у меня есть REST API с вызовом метода "GetFile ()", который преобразует объект FileInformation в объект MemoryStream.Затем назначьте этот MemoryStream как содержимое HttpResponseMessage и вернитесь.Вот код:

[HttpGet]
[Route("/GetFile")]
public HttpResponseMessage GetFile()
{
    // This is a file from Sharepoint CSOM
    FileInformation fileInfo = /*get a file*/;

    // Creates a MemoryStream for the content of HttpResponseMessage
    var memoryStream = new MemoryStream();
    fileInfo.Stream.CopyTo(memoryStream );
    // byte[] testData1 = memoryStream.ToArray(); -> Here confirm the data.

    // This allows to assign the stream as content of the HttpResponseMessage
    memoryStream.Position = 0;

    // Creates the HttpResponseMessage
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

    // Assign the MemoryStream as content of HttpResponseMessage
    result.Content = new StreamContent(memoryStream);

    // Again, confirm the data
    //byte[] testData2 = result.Content.ReadAsByteArrayAsync().Result;

    // Return the HttpResponseMessage
    return result;
}

Как видите, я проверяю, что данные проходят через весь метод, и файл, с которым я тестирую, создает более десяти тысяч байтов в testData1 / testData2.

Я хотел протестировать клиентскую часть, поэтому я создал еще один вызов метода "Test ()".Я должен прояснить, что мой «клиент» будет запрашивать файл через HttpWebRequest или что-то подобное из веб-интерфейса, а не из браузера.Я пробовал два способа получения данных.

Метод 1

[HttpGet]
[Route("/Test")]
public async Task<ActionResult> TestAsync()
{
    HttpClient httpClient = new HttpClient();
    HttpResponseMessage testResponse = await httpClient.GetAsync("http://localhost:2000/GetFile");
    byte[] testData3 = testResponse.Content.ReadAsByteArrayAsync().Result;

    // I don't really care about the return for now
    return null;
}

Переменная testData3 имеет около 300 байтов, что представляет собой:

{"version": {"major": 1,"несовершеннолетний": 1, "построить": - 1, "пересмотр": - 1, "majorRevision": - 1, "minorRevision": - 1}, "содержание": { "заголовки": []}, "StatusCode": 200," reasonPhrase ":" OK "," headers ": []," requestMessage ": null," isSuccessStatusCode ": true}}

Метод 2

[HttpGet]
[Route("/Test")]
public ActionResult Test()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:2000/GetFile");
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (Stream stream = response.GetResponseStream())
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                // Create an empty MemoryStream
                var memoryStream = new MemoryStream();

                // Copy the stream content to the MemoryStream
                reader.BaseStream.CopyTo(memoryStream);
                //byte[] testData4 = memoryStream.ToArray();

                // Wtite the response stream
                string dataString = reader.ReadToEnd();
                Console.WriteLine(dataString);
            }
        }
    }
}

Переменная testData4 имеет те же байты, что и testData3, и может быть записана с помощью dataString:

{"version": {"основным ": 1," несовершеннолетний ": 1," построить ": - 1," пересмотр ": - 1," majorRevision ": - 1," minorRevision ": - 1}," содержание ": {" заголовки ": []}, "statusCode": 200, "reasonPhrase": "OK", "headers": [], "requestMessage": null, "isSuccessStatusCode": true}

Что мне нужно Я хотел бы получить байты в testData1 / testData2 из метода "Test ()".

...