Search code examples
c#asp.net-web-apiasp.net-core-webapimemorystream

Can we send a memory stream object with web API?


I have one memory stream object in my server-side, this object should be accessible in another party, which I call it a client or a consumer for my API. In server-side I have a method like this (parameters.Save is related to a third-party library)

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

I'm thinking about sending this memory stream to a client with web API, so my action is something like this:

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

I'm not sure if it is the right way and this implementation is correct because I am in trouble to consume it: I do not know which method of httpClient I have to use: ReadAsStreamAsync() or anything else, because I could not find anything to work


Solution

  • I found the solution like this: here is in server side:

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

    and here is in client-side:

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