这是通过流“转发”图像请求的正确方法吗?

问题描述 投票:0回答:1

我正在实现一个API控制器,该API控制器需要充当检索图像的网关。稍后,此网关需要检查用户是否获得了获取图像的权限,但是目前,仅实现了对图像的流式传输,我的问题是,因为我不想以糟糕的方式实现流式网关:这是正确的方法还是有更好的方法?

当前为代码:

    public IHttpActionResult Get(string objectId, string sessionId, string path)
    {
        var url = "An url to a jpeg or any other image";
        var copyOfStream = new MemoryStream();

        var request = WebRequest.Create(url);
        var getImageResponse = request.GetResponse();

        try
        {

            var stream = getImageResponse.GetResponseStream();
            stream.CopyTo(copyOfStream);
        }
        finally
        {
            getImageResponse.Close();
        }

        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(copyOfStream)
        };

        var contentType = MimeMapping.GetMimeMapping(Path.GetExtension(".jpg"));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);

        return ResponseMessage(response);
    }

有任何改进建议吗?

c# stream httprequest
1个回答
1
投票

我会采取不同的方式来摆脱一些麻烦的部分:

  1. 一次性物品会被丢弃,可能会泄漏。
  2. 图像二进制数据已完全加载到内存中并从那里提供
  3. 注意:请注意,当前实现将始终提供0个字节,因为在将其提供给响应之前没有调用copyOfStream.Position = 0
  4. 这是一种全部读取/全部写入的方法,比“边读边写”要慢]

所以这是一个建议的解决方案,它:

  1. 在当前请求完成后,使用HttpRequestMessage.RegisterForDispose扩展名注册用于处理的一次性对象,
  2. [从目标网站读取时,将数据分块地写入响应流(如果Web API框架如此工作,很有可能)

我希望这会有所帮助:

    public IHttpActionResult Get(string objectId, string sessionId, string path)
    {
        var url = "An url to a jpeg or any other image";

        var request = WebRequest.Create(url);

        var getImageResponse = request.GetResponse();

        // Register the WebResponse for late disposal
        Request.RegisterForDispose(getImageResponse);

        Stream inputStream = getImageResponse.GetResponseStream();

        // Register the response stream for late disposal
        Request.RegisterForDispose(inputStream);

        // We haven't read anything from the wire yet:
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(inputStream)
        };

        var contentType = MimeMapping.GetMimeMapping(Path.GetExtension(".png"));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);

        return ResponseMessage(response);
    }
© www.soinside.com 2019 - 2024. All rights reserved.