Ответ 1
В моем случае у меня был файл ashx, помеченный как тип содержимого None, а не как Content, то есть Properties → Build Action для него должен был быть Content, что означает, что файл ashx wasn Включено при публикации сайта.
Я использую обработчик запросов ashx для получения изображений, и моя точка останова в файле ashx не попадает. Когда я использую firebug, я вижу, что запрос возвращает 404, что заставляет меня думать, что мне нужно настроить некоторые настройки, чтобы файл ashx можно было найти.
Я использую visual studio 2008 и .net 3.5.
Файл ASHX
namespace hybrid.content.Handlers
{
public class DB_Images : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
Int32 image_id;
if (context.Request.QueryString["id"] != null)
image_id = Convert.ToInt32(context.Request.QueryString["id"]);
else
throw new ArgumentException("No parameter specified");
context.Response.ContentType = "image/jpeg";
Stream strm = GetImageFromDatabase(image_id);
if (strm != null)
{
byte[] buffer = new byte[4096];
int byteSeq = strm.Read(buffer, 0, 4096);
while (byteSeq > 0)
{
context.Response.OutputStream.Write(buffer, 0, byteSeq);
byteSeq = strm.Read(buffer, 0, 4096);
}
//context.Response.BinaryWrite(buffer);
}
}
public Stream GetImageFromDatabase(int image_id)
{
SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
//connstr.InitialCatalog = "dummy";
//connstr.UserID = "sa";
//connstr.Password = "password";
//connstr.DataSource = "source";
connstr.InitialCatalog = "smsdb";
connstr.UserID = "user";
connstr.Password = "password";
connstr.DataSource = "10.31.4.79";
SqlConnection conn = new SqlConnection(connstr.ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
// cmd.CommandText = "select image from cis_images where image_id = @p_image_id";
cmd.CommandText = "select image from test_images where image_id = @p_image_id";
cmd.Parameters.AddWithValue("@p_image_id", image_id);
conn.Open();
object img = cmd.ExecuteScalar();
try
{
return new MemoryStream((byte[])img);
}
catch
{
return null;
}
finally
{
conn.Close();
conn.Dispose();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Событие щелчка страницы
protected void Button1_Click(object sender, EventArgs e)
{
Image1.ImageUrl = "~/DB_Images.ashx?id=" + TextBox1.Text;
}
ashx html
<%@ WebHandler Language="C#" CodeBehind="DB_Images.ashx.cs" Class="hybrid.content.Handlers.DB_Images" %>
От этой ссылки не существует никаких html.
Есть ли что-то, что мне не хватает, чтобы заставить это работать?
В моем случае у меня был файл ashx, помеченный как тип содержимого None, а не как Content, то есть Properties → Build Action для него должен был быть Content, что означает, что файл ashx wasn Включено при публикации сайта.
Если вы используете общие обработчики в ASP.NET, есть несколько вещей, которые нужно проверить.
1.) Убедитесь, что вы установили флаг "32-разрядное приложение" в пул приложений до 32 бит, если он действительно 32 бит. По умолчанию используется значение "False".
2.) Превратите пул приложений из интегрированного в классический
3.) Измените версию .NET в пуле приложений соответствующим образом. В вашем случае используйте v2, так как 3.5 использует версию 2..NET 4.0 использует .NET 4.0.
4.) Убедитесь, что зарегистрирован ASP.NET. Запустите все в блоках кода.
C: \ > cd C:\Windows\Microsoft.NET\Framework64\{version}
C:\Windows\Microsoft.NET\Framework64 {версия} > aspnet_regiis.exe -i
5.) Выберите "ISAPI и CGI Restrictions" после правого щелчка по имени сервера (а не имени сайта) в диспетчере IIS и щелкните правой кнопкой мыши правильную строку "ASP.NET {version}" и выберите "Разрешить".
6.) Убедитесь, что у вас есть сопоставления обработчиков (для *.ashx) (ака "Включено" ) на уровне сервера или на уровне сайта или явно в файле web.config.
Я думаю, проблема в URL. ~/
означает ваш корневой каталог.
Use ResolveClientUrl("yourPathHere") or ResolveUrl("yourPathHere").
Чтобы узнать подробности об этой ошибке, проверьте источник изображения и скопируйте и вставьте его в адресную строку. Появится желтая страница, состоящая из деталей.
Я думаю, что единственной проблемой является URL.