我正在实现一个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);
}
有任何改进建议吗?
我会采取不同的方式来摆脱一些麻烦的部分:
copyOfStream.Position = 0
所以这是一个建议的解决方案,它:
HttpRequestMessage.RegisterForDispose
扩展名注册用于处理的一次性对象,我希望这会有所帮助:
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);
}