Я знаю, что этот вопрос довольно старый, но я нашел решение, которое, кажется, работает для меня.
Мое решение - вызвать обработчик ASHX, который затем возвращает изображение, в среднем эта служба вызывается между 10-14 разами за загрузку страницы определенной страницы.
Я использую пространство имен ODP.NET Oracle.DataAccess.Client V4.112.3.60 для 64 бит.
У меня есть весь мой код в использовании операторов (обфускация здесь):
using (OracleConnection conn = new OracleConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["####"].ConnectionString))
{
using (OracleCommand cmd = new OracleCommand(query, conn))
{
OracleParameter p = new OracleParameter("####", OracleDbType.Varchar2, 10);
p.Direction = ParameterDirection.Input;
p.Value = val;
cmd.Parameters.Add(p);
conn.Open();
using(OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
if (reader.HasRows)
{
while (reader.Read())
{
OracleBlob lob = reader.GetOracleBlob(0);
//OracleLob lob = reader.GetOracleLob(0);
srcImage = new Bitmap(lob);
}
newImage = resizeImage(srcImage, new Size(120, 150));
newImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
else
{
srcImage = new Bitmap("Images/none.jpg");
newImage = resizeImage(srcImage, new Size(120, 150));
newImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
ProcessError(ref context, 500);
}
}
p.Dispose();
}
}
Я пробовал много вещей:
- Проверка других соединений, открытых одновременно
- Переписал элемент управления источником данных SQL, чтобы у меня было больше контроля над соединениями
- Использование System.Data.OracleClient)
Но когда дело дошло до пошагового выполнения кода, я обнаружил, что иногда код не достигает конца используемого блока, и следующий запрос поступает в обработчик, прежде чем он достигнет конца (я предполагаю, что-то делать с максимальными запросами к обработчику?) это привело к тому, что некоторые сеансы остались открытыми в V $ SESSION, которые мне пришлось закрыть вручную.
Я наткнулся на этот бит кода:
OracleConnection.ClearAllPools();
И попытался запустить его, хотя обработчик оставлял сеансы открытыми, по крайней мере, они были бы закрыты этим кодом, в настоящее время он выполняется в конце блока using для OracleConnection (поэтому каждый раз, когда служба вызвал его, очищает пулы, надеется, что обработчику удастся выполнить это далеко!).
Так что использование метода ClearAllPools, похоже, работает, но я знаю, что это не идеальное решение.