我们可以使用Web API发送内存流对象吗?

问题描述

我在服务器端有一个内存流对象,该对象应该在另一方可以访问,我将该方称为API的客户端或使用者。 在服务器端,我有一个像这样的方法(parameters.Save与第三方库有关)

    public MemoryStream GetSerializedParameters()
    {
        var parameters = GetParameters();
        MemoryStream memory = new MemoryStream();
        parameters.Save(memory);
        return memory;
    }

我正在考虑使用Web API将内存流发送到客户端,所以我的操作是这样的:

[HttpGet("parameters")]
    public HttpResponseMessage GetParameters()
    {
        var stream = _server.GetSerializedParameters();
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentLength = stream.Length;
        return result;
    }

我不确定这是否正确,并且此实现是否正确,因为我在使用它时遇到了麻烦: 我不知道我必须使用哪种httpClient方法ReadAsstreamAsync()或其他任何方法,因为找不到有效的方法

解决方法

根据我下面的代码可能会帮助您:

WEB API:

        [HttpGet]
    public HttpResponseMessage ReadToStream(HttpRequestMessage requestMessage)
    {
       
            var streamObj = _server.GetSerializedParameters();
            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new StreamContent(streamObj);
            requestMessage.RegisterForDispose(streamObj);
            response.StatusCode = HttpStatusCode.OK;

            return response;
   }

客户端

public async Task<string> DownloadFile(string guid)
{
var fileInfo = new FileInfo($"{guid}.txt");

var response = await _httpClient.GetAsync($"{url}/api/fileDownloadAPI?guid={guid}");
response.EnsureSuccessStatusCode();
await using var ms = await response.Content.ReadAsStreamAsync();
await using var fs = File.Create(fileInfo.FullName);
ms.Seek(0,SeekOrigin.Begin);
ms.CopyTo(fs);
return fileInfo.FullName;
}
,

当然可以:

 [HttpGet]
        public async Task Get()
        {
            var randomString = "thisIsCool";
            var randomStringBytes = Encoding.UTF8.GetBytes(randomString);
            using (var ms = new MemoryStream(randomStringBytes))
            {
                await ms.CopyToAsync(this.Response.Body);
            }
        
,

我找到了这样的解决方案: 这是在服务器端:

    [HttpGet("parameters")]
    public IActionResult GetParameters()
    {
        var stream = _server.GetSerializedParameters();
        stream.Seek(0,SeekOrigin.Begin);
        return File(stream,MediaTypeNames.Text.Plain,"parameters.txt");
    }

这是在客户端:

        public MemoryStream StoreParameters()
    {
        var request =new HttpRequestMessage
        {
            RequestUri = new Uri("https://localhost:44316/api/parameters"),Method = HttpMethod.Get
        };
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var result = _httpClient.SendAsync(request,HttpCompletionOption.ResponseHeadersRead).Result;
        var ms = new MemoryStream();

        result.Content.CopyToAsync(ms).Wait();
        return result.IsSuccessStatusCode ? ms: null;
    }