доступ к универсальному обработчику в user control cs?

#c# #asp.net #.net

#c# #asp.net #.net

Вопрос:

Я создал универсальный обработчик .ashx, который помещается в root.

В моей папке UserControls у меня есть пользовательский элемент управления, который хочет получить доступ к статическому методу этого класса ashx. Но я не могу получить доступ к классу ashx или его методу. Требует ли это какого — либо подтверждения или регистрации ?

код ashx:

     <%@ WebHandler Language="C#" Class="GetTileImage" %>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;
using System.Net;
public class GetTileImage : IHttpHandler, IRequiresSessionState
{
    const string c_key = "dzi";
    public void ProcessRequest(HttpContext context)
    {
        //context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(60));  
    }
    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

    public static Bitmap LoadImage(string imageUrl)
    {
        Dictionary<string, Bitmap> images = (Dictionary<string, Bitmap>)HttpContext.Current.Session[c_key];
        if (images == null)
        {
            images = new Dictionary<string, Bitmap>();
            HttpContext.Current.Session[c_key] = images;
        }
        Bitmap bmp = null;
        if (!images.ContainsKey(imageUrl))
        {
            try
            {
                string url = imageUrl;
                if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
                    url = HttpContext.Current.Server.MapPath(url); WebClient wc = new WebClient(); Stream fs = wc.OpenRead(url); bmp = new Bitmap(fs); fs.Close();
            }
            catch { return null; }
        } images.Add(imageUrl, bmp); if (images.Count > 5)
        {
            Dictionary<string, Bitmap>.KeyCollection.Enumerator e = images.Keys.GetEnumerator();
            e.MoveNext();
            string key = e.Current;
            images.Remove(key);
        }
        return bmp;
    }
}
 

Пользовательский контроль, где я получаю доступ к этому:

  Bitmap bmp = GetTileImage.LoadImage("");
 

Помогите, пожалуйста

Комментарии:

1. Это не должно быть проблемой и не требует ничего особенного, можете ли вы включить какой-нибудь пример исходного кода?

2. Почему метод находится в обработчике? Чего вы пытаетесь достичь, вызывая его? Я не думаю, что вызов кода в обработчике из элемента управления, вероятно, будет хорошей идеей.

3. Спасибо, Джонас Х., я улучшаю некоторую работу.

4. @PirateKitten, пожалуйста, посмотрите мою правку, я добавил код.

5. Дал ли мой ответ ниже какое-либо представление?

Ответ №1:

Я не думаю, что вы сможете вызывать код из другого места, если не добавите пространство имен для класса:

 namespace MyNamespace 
{

    public class GetTileImage : IHttpHandler, IRequiresSessionState
    {
    // etc. etc.
    }

}
 

MyNamespace должно быть заменено любым пространством имен, которое вы используете для остальной части вашего кода.

В любом случае я немного озадачен, почему этот код вообще находится в an .ashx — в его нынешнем виде, поскольку ProcessRequest не имеет кода, обработчик фактически ничего не будет делать.

Комментарии:

1. Я попробовал ваш способ, но все еще не смог получить доступ к классу ashx или его статическим методам. Требуется ли какое-либо добавление или изменение пространства имен и т. Д.? В общем, можем ли мы вызвать класс страницы ashx или статические методы на странице за классом cs?

Ответ №2:

Нет, вы не можете получить доступ Generic к методу класса обработчика в коде (aspx, ascx и т. Д.). Вам нужно будет создать статический (не обязательно) класс (файл) в App_Code папке и переместить в него этот метод.

 public class GetTileImage
{
 public static Bitmap LoadImage(string imageUrl)
    {
     ..
    }
}
 

Комментарии:

1. что значит » не можешь » ? Пожалуйста, расставьте пробелы. Вы имеете в виду, что к ashx нельзя получить доступ на странице за cs или в пользовательском управлении за cs?

Ответ №3:

Я думаю, это может быть просто потому, что ваш код находится в вашем файле ASHX, если вы использовали файл с кодом, он должен быть в порядке. например:

Полученное изображение.ashx:

<%@ WebHandler Language="C#" CodeBehind="GetTileImage.ashx.cs" Class="MyNamespace.GetTileImage" %>

Получить изображение.ashx.cs:

 // < using statements here...>

namespace MyNamespace
{
    public class GetTileImage: IHttpHandler
    {
         // < include necessary overrides... >

         public static Bitmap LoadImage()
         {
             // < code here... >
         }
    }
}
 

Затем вы должны обнаружить, что можете вызывать GetTileImage.LoadImage в другом месте своего кода (здесь протестировано нормально). Как уже указывалось, было бы лучше переместить LoadImage в служебный класс, который будут использовать как ваш обработчик, так и ваши пользовательские контроллеры.