c#-从HTTPRuntime缓存中检索图像
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-从HTTPRuntime缓存中检索图像,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2545字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试从HTTPRuntime缓存中保存和检索图像,但出现异常.我能够将流保存到缓存中,但是当我尝试对其进行检索时,出现一个异常:
the request was aborted. The connection was closed unexpectedly
这是我的代码:
public void ProcessRequest(HttpContext context)
{
string courseKey = context.Request.QueryString["ck"];
string objKey = context.Request.QueryString["file"];
if(HttpRuntime.Cache[objKey] !=null)
{
using (Stream stream = (Stream)HttpRuntime.Cache[objKey]) // here is where I get an exception
{
var buffer = new byte[8000];
var bytesRead = -1;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
context.Response.OutputStream.Write(buffer, 0, bytesRead);
}
}
return;
}
var response = Gets3Response(objKey, courseKey, context);
if (response != null)
{
using (response)
{
var MIMEtype = response.ContentType;
context.Response.ContentType = MIMEtype;
var cacheControl = context.Response.CacheControl;
HttpRuntime.Cache.Insert(objKey, response.ResponseStream, null, DateTime.UtcNow.AddMinutes(20), Cache.NoSlidingExpiration);
using (Stream responseStream = response.ResponseStream)
{
var buffer = new byte[8000];
var bytesRead = -1;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
context.Response.OutputStream.Write(buffer, 0, bytesRead);
}
}
}
}
}
这是我得到的例外
解决方法:
这段代码很混乱.首先,您要缓存response.ResponseStream,但已将其包装在using块中.因此,当您到达HttpRuntime.Cache.Insert时,response.ResponseStream已被处置并关闭.因此,错误.
您不应该缓存流.一方面,一旦部署了分布式缓存服务,您的方法将是不可能的.您需要重构它.考虑:
public class CacheAsset
{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Content { get; set; }
}
CacheAsset GetAsset(HttpContext context)
{
string courseKey = context.Request.QueryString["ck"];
string objKey = context.Request.QueryString["file"];
var asset = context.Cache[objKey] as CacheAsset;
if (asset != null) return asset;
using (var response = Gets3Response(objKey, courseKey, context))
using (var stream = new MemoryStream())
{
var buffer = new byte[8000];
var read = 0;
while ((read = response.ReponseStream.Read(buffer, 0, buffer.Length)) > 0)
{
stream.Write(buffer, 0, read);
}
asset = new CacheAsset
{
FileName = objKey,
ContentType = reponse.ContentType,
Content = stream.ToArray()
};
context.Cache.Insert(objKey, asset, null, DateTime.UtcNow.AddMinutes(20), Cache.NoSlidingExpiration);
}
return asset;
}
public void ProcessRequest(HttpContext context)
{
var asset = GetAsset(context);
context.Response.ContentType = asset.ContentType;
context.Response.BinaryWrite(asset.Content);
}
内容总结
以上是互联网集市为您收集整理的c#-从HTTPRuntime缓存中检索图像全部内容,希望文章能够帮你解决c#-从HTTPRuntime缓存中检索图像所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。