Как сервер, у меня есть 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 ()".