【问题标题】:Can we send a memory stream object with web API?我们可以使用 Web API 发送内存流对象吗?
【发布时间】:2020-09-07 08:35:01
【问题描述】:

我的服务器端有一个内存流对象,该对象应该可以在另一方访问,我将其称为我的 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() 或其他任何方法,因为我找不到任何工作

【问题讨论】:

  • 你为什么要这么做?

标签: c# asp.net-web-api asp.net-core-webapi memorystream


【解决方案1】:

当然可以:

 [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);
            }
        

【讨论】:

    【解决方案2】:

    根据我的理解,下面的代码可能会对您有所帮助:

    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;
    }
    

    【讨论】:

    • 感谢您的回复,但 streamObj 是 MemoryStream 对象,它没有 OutputStream 属性。
    • 更新了代码。基本上在我的情况下,我返回了一个自定义对象,其属性是 Outputstream。所以这里我们可以直接使用streamObj。
    • 好的,谢谢。有没有办法将文件存储在内存流中而不是客户端的文件流中?
    • 抱歉,没听懂。您的意思是我们可以将文件存储为内存流,而不是将文件保存在网络服务器上的磁盘上吗?你能解释一下你的要求吗?
    • 感谢 Vikas 的努力,我找到了解决方案。
    【解决方案3】:

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

        [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;
        }
    

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2021-04-14
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多