Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Отображение ресурса из интернета в локальной сети


Автор: FoXIT 4.12.2009, 08:53
Здравствуйте товарищи!
Опишу что есть.
Есть сервер с IIS. На нем крутится внутренний сайт организации, который доступен только из локальной сети.
Есть сервер с RedHat, на нем крутится прокся и раздает интернет избранным.

Задача в следующем, нужно на внутреннем сайте отобразить прогноз погоды из интернета, напривер информер gismeteo.
Для обладателей доступа в интернет это не проблема, а вот как быть с теми у кого нет интернета?

Автор: 1stain 4.12.2009, 11:30
Делаешь хэндлер
Код

    /// <summary>
    /// Summary description for $codebehindclassname$
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class GismeteoHandler : IHttpHandler
    {
        [DllImport("advapi32.dll")]
        public static extern bool LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType,
                                            int dwLogonProvider, out int phToken);

        private byte[] ImageContent
        { 
            get
            {
                return HttpContext.Current.Cache["GisMeteoWeatherImage"] as byte[];
            }
            set
            {
                HttpContext.Current.Cache.Add("GisMeteoWeatherImage", value, null, DateTime.Now.AddMinutes(15.0),
                                              Cache.NoSlidingExpiration, CacheItemPriority.Low, null);
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            if (ImageContent == null)
            {
                ReadWeatherImageContent(); 
            }

            context.Response.AddHeader("Content-Length", ImageContent.Length.ToString());
            context.Response.ContentType = "image/gif";
            context.Response.BinaryWrite(ImageContent);
        }

        private void ReadWeatherImageContent()
        {
            // данные аккаунта с доступом в инет лучше хранить зашифрованными в web.config
            string weatherUserId = "";
            string weatherUserDomain = "";
            string weatherUserPassword = "";

            int returnedToken;

            if (LogonUser(weatherUserId, weatherUserDomain, weatherUserPassword, 3, 0, out returnedToken))
            {
                IntPtr token = new IntPtr(returnedToken);
                WindowsImpersonationContext impersonationContext = WindowsIdentity.Impersonate(token);
                try
                {
                    var request = (HttpWebRequest)WebRequest.Create("http://informer.gismeteo.ru/new/4944-30.GIF");
                    var response = (HttpWebResponse)request.GetResponse();
                    using (StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251)))
                    {
                        ImageContent = Encoding.GetEncoding(1251).GetBytes(stream.ReadToEnd());
                    }
                }
                finally
                {
                    impersonationContext.Undo();
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


на странице:
Код

<asp:Image runat="server" ImageUrl="~/AppCode/GismeteoHandler.ashx" />

Автор: FoXIT 7.12.2009, 13:48
Этот хендлер насколько я понял передает только картинку.

А что делать если надо информер посложнее там и текст и картинки?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)