• Как всё-таки сделать динамическую sitemap.xml для сайта?

    geeek
    @geeek
    Контроллер:

    public class SeoController : Controller
        {
            private const string SitemapsNamespace = "http://www.sitemaps.org/schemas/sitemap/0.9";
    
            [NonAction]
            private IEnumerable<SitemapNode> GetSitemapNodes()
            {
                // вот так добавляются статические ноды
                var nodes = new List<SitemapNode>
                {
                    new SitemapNode(ControllerContext.RequestContext,
                        new {area = "", controller = "Home", action = "Index"})
                    {
                        Frequency = SitemapFrequency.Monthly,
                        Priority = 0.5
                    },
                    new SitemapNode(ControllerContext.RequestContext,
                        new {area = "", controller = "Home", action = "About"})
                    {
                        Frequency = SitemapFrequency.Monthly,
                        Priority = 0.5
                    }
                };
                  // а вот так динамические
                    var items = model.Collection.ToList();
                    foreach (var item in items)
                    {
                        nodes.Add(new SitemapNode(ControllerContext.RequestContext,
                            new {area = "", controller = "Home", action = "blablabla", link = item.Id})
                        {
                            Frequency = SitemapFrequency.Weekly,
                            Priority = 0.8
                        });
                    }
            }
    
            [NonAction]
            private string GetSitemapXml()
            {
                XNamespace xmlns = SitemapsNamespace;
    
                var nodes = GetSitemapNodes();
    
                var root = new XElement(xmlns + "urlset");
    
    
                foreach (var node in nodes)
                {
                    root.Add(
                        new XElement(xmlns + "url",
                            new XElement(xmlns + "loc", Uri.EscapeUriString(node.Url)),
                            node.Priority == null
                                ? null
                                : new XElement(xmlns + "priority",
                                    node.Priority.Value.ToString("F1", CultureInfo.InvariantCulture)),
                            node.LastModified == null
                                ? null
                                : new XElement(xmlns + "lastmod",
                                    node.LastModified.Value.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:sszzz")),
                            node.Frequency == null
                                ? null
                                : new XElement(xmlns + "changefreq", node.Frequency.Value.ToString().ToLowerInvariant())
                            ));
                }
    
                using (var ms = new MemoryStream())
                {
                    using (var writer = new StreamWriter(ms, Encoding.UTF8))
                    {
                        root.Save(writer);
                    }
    
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
    
            [OutputCache(Duration = 60*60, Location = System.Web.UI.OutputCacheLocation.Any)]
            public ActionResult SitemapXml()
            {
                var content = GetSitemapXml();
                return Content(content, "application/xml", Encoding.UTF8);
            }
    
            [OutputCache(Duration = 60*60, Location = System.Web.UI.OutputCacheLocation.Any)]
            public FileContentResult RobotsText()
            {
                var content = new StringBuilder("User-agent: *" + Environment.NewLine);
                content.Append("Host: ").Append("www.твой-домен.ru" + Environment.NewLine);
                content.Append("Sitemap: ")
                    .Append("www.твой-домен.ru")
                    .Append("/sitemap.xml" + Environment.NewLine);
                return File(
                    Encoding.UTF8.GetBytes(content.ToString()),
                    "text/plain");
            }
        }


    Модель:

    public class SitemapNode
        {
            public string Url { get; set; }
            public DateTime? LastModified { get; set; }
            public SitemapFrequency? Frequency { get; set; }
            public double? Priority { get; set; }
    
    
            public SitemapNode(string url)
            {
                Url = url;
                Priority = null;
                Frequency = null;
                LastModified = null;
            }
    
            public SitemapNode(RequestContext request, object routeValues)
            {
                Url = GetUrl(request, new RouteValueDictionary(routeValues));
                Priority = null;
                Frequency = null;
                LastModified = null;
            }
    
            private string GetUrl(RequestContext request, RouteValueDictionary values)
            {
                var routes = RouteTable.Routes;
                var data = routes.GetVirtualPathForArea(request, values);
    
                if (data == null)
                {
                    return null;
                }
    
                var baseUrl = request.HttpContext.Request.Url;
                var relativeUrl = data.VirtualPath;
    
                return request.HttpContext != null &&
                       (request.HttpContext.Request != null && baseUrl != null)
                    ? new Uri(baseUrl, relativeUrl).AbsoluteUri
                    : null;
            }
        }
    
        public enum SitemapFrequency
        {
            Never,
            Yearly,
            Monthly,
            Weekly,
            Daily,
            Hourly,
            Always
        }


    В Web.config добавь в system.webServer :

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
      </system.webServer>


    Ну и сами маршруты:

    routes.MapRoute(
                    name: "sitemap.xml",
                    url: "sitemap.xml",
                    defaults: new {controller = "Seo", action = "SitemapXml"}
                    );
    
                routes.MapRoute(
                    name: "robots.txt",
                    url: "robots.txt",
                    defaults: new {controller = "Seo", action = "RobotsText"}
                    );
    Ответ написан
  • Есть ли достойный аудиокурс английского?

    Prognosticator
    @Prognosticator
    TODO: Здесь будут ворованные умные мысли, типа мои
    Pimsleur English for Russian.
    На рутрекере лежит.
    Ответ написан
    4 комментария
  • Есть ли достойный аудиокурс английского?

    uaKorona
    @uaKorona
    Front-End разработчик
    Мне нравится курс Драгункина. Есть и аудио и видео.
    Нравится не традиционный, более понятный подход к изучению языка.
    И еще нравится то, что рассказывает с юмором. Положительные эмоции ускоряют запоминание
    Ответ написан
    3 комментария
  • Кто может дать пример парсинга json в C#?

    @Oxoron
    Шарпер
    internal static class Serializer
        {
            internal static void Serialize<T>(this T arg, string fileName)
            {
                string res = JsonConvert.SerializeObject(arg, Formatting.Indented);
                File.WriteAllText(fileName,res);
            }
    
            internal static T Deserialize<T>(string fileName)
            {
                string json = File.ReadAllText(fileName);
                T res = JsonConvert.DeserializeObject<T>(json);
                return res;
            }
        }

    Этот класс сериализует\десериализует объекты.

    public class Item 
    {
    ...
    public string title{get; set;}
    public string url{get;set;}
    ...
    }

    Это класс одной записи. Для сериализации используйте автосвойства (те самые get; set;), обязательно public.

    public class Response
    {
    public int count{get;set;}
    public List<Item> items{get; set;}
    }


    Для получения данных используете код вроде
    string pathToFIle = @"C:\temp\anyFile";
    Response response = Serializer.Deserialize<Response>(pathToFile);
    String[] titles = response.items.Select(item => item.title).ToArray(); // Массив названий
    String[] urls = response.items.Select(item => item.url)ToArray(); // Массив адресов


    библиотека: newtonsoft.json.dll

    Если надо - могу скинуть готовый пример (на тостере есть личка?).

    Также посетите json2csharp.com
    Вставьте в поле свой Json-образец, сразу получите необходимые классы.
    Ответ написан
    10 комментариев
  • Как сделать текст "не копируемым" в HTML?

    любая подобная "защита" легко обходиться - лучше просто закрепить в поисковых системах авторство за собой и контролировать попытки "цитирования"
    Ответ написан
    Комментировать
  • Как правильно использовать микроразметку schema.org?

    VitalySorokin
    @VitalySorokin
    тружусь во благо «ТМ»
    Микроразметка не должна создаваться только ради «микроразметки», она должна завязываться на структуре html документа, и использовать те данные, которые изначально присутствуют в дизайне и верстке. Т.е не стоит для этого делать дополнительную разметку.
    И да, присутствие всех атрибутов перечисленных для схемы «article» необязательно.
    Ответ написан
    6 комментариев
  • Где покупать SSL сертификаты?

    savostin
    @savostin
    Еще один программист
    Смотря для каких целей.
    Посмотрите StartSSL
    Ответ написан
    4 комментария
  • 301 redirect ASP.NET?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Содержимое web.config - реально работающий пример (названия сайтов изменены на фейковые), который:
    1) при переходе на www.company.ru перенаправляет на company.ru
    2) при переходе на mysite.com перенаправляет на company.ru
    3) при переходе на www.mysite.com перенаправляет на company.ru
    4) сохраняется ссылочная целостность, т.е. при переходе по www.mysite.com/home/write_to_us перенаправляет на company.ru/home/write_to_us

    Если не работает, значит, что-то с модулем URL Rewrite Module в IIS.

    На сайте mysite.com (с которого будет редирект) в web.config пишем:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
    	<rewrite>
    		<rules>			
    			<rule name="Condition1" stopProcessing="true">
    				<match url="^(.*)$" ignoreCase="false" />
    				<conditions logicalGrouping="MatchAll">
    					<add input="{HTTP_HOST}" pattern="^(www\.)?mysite\.com$" />
    				</conditions>
    				<action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			</rule>
    			<rule name="Condition2" stopProcessing="true">
    				<match url="^(.*)$" ignoreCase="false" />
    				<conditions logicalGrouping="MatchAll">
    						<add input="{HTTP_HOST}" pattern="^www\.company\.ru" />
    				</conditions>
    				<action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			</rule>
    		</rules>
    	</rewrite>
      </system.webServer>
    </configuration>


    На сайте company.ru (на который будет редирект) в web.config пишем:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <system.webServer>
    	  <rewrite>
    		  <rules>
    			  <rule name="Redirect to company.ru 1" stopProcessing="true">
    				  <match url="^(.*)$" ignoreCase="false" />
    				  <conditions logicalGrouping="MatchAll">
    					  <add input="{HTTP_HOST}" pattern="^(www\.)?mysite\.com$" />
    				  </conditions>
    				  <action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			  </rule>
    			  <rule name="Redirect to company.ru 2" stopProcessing="true">
    				  <match url="^(.*)$" ignoreCase="false" />
    				  <conditions logicalGrouping="MatchAll">
    						  <add input="{HTTP_HOST}" pattern="^www\.company\.ru" />
    				  </conditions>
    				  <action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			  </rule>
    		  </rules>
    	  </rewrite>
      </system.webServer>
      ...
    </configuration>


    Возможно, сама Visual Studio будет у Вас ругаться на наличие секции "rewrite" - у меня она эту секцию подчеркивала. В чем причина - я, честно говоря, не помню, но на самом сайте уже все работает на ура.

    Успехов!
    Ответ написан
    8 комментариев
  • Как поставить уведомления Google Cloud Messaging в свое приложение Android?

    @onepavel
    Консультация и разработка мобильных приложений
    расписано по шагам
    developer.android.com/google/gcm/index.html

    1. активация апи для вашего приложения
    developer.android.com/google/gcm/gs.html
    в консоле google api создаете проект, среди всего списка доступных api
    включаете чекбокс Google Cloud Messaging
    консоль живет здесь https://code.google.com/apis/console/?noredirect&pli=1

    2. подключаете Google Play Services
    импортируете сам проект, что лежит в google_play_services/libproject/google-play-services_lib,
    а уже в заимпортированный проект добавляете jar из google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
    это нужно для того, что бы тащить необходимые библиотеке ресурсы, которые в jar не упаковываются
    Ответ написан
    2 комментария
  • Facebook sharing или поделиться с фейсбук

    sumyuga
    @sumyuga Автор вопроса
    сам себе и отвечу, может кому и пригодится.
    Facebook кэширует данные OpenGraph по URLу на 24 часа, а сбросить кэш этих данных конкретной страницы можно здесь: https://developers.facebook.com/tools/debug
    Ответ написан
    1 комментарий
  • Как убрать .html в конце адреса каждой веб-страницы сайта, без использования php?

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ! \.html$
    RewriteCond %{REQUEST_URI} ! /$
    RewriteRule ^(.*)$ $1.html


    В htaccess. Обращение на /about будет открывать /about.html, к примеру
    Ответ написан
    2 комментария
  • Как повысить карму?

    GurinovichEvgen
    @GurinovichEvgen
    Вот я, зарегился на хабре недавно. Не для того, чтобы набить карму, поднять рейтинг и так далее. Мне это вообще-то не интересно и честно говоря я имел смутное представление о карме, но… Вот сижу на вопросе как поднять карму. Почему?
    Да потому, что я хочу поделиться своим опытом в статьях и услышать мнение других, но… Для этого мне нужна карма. Как мне набрать карму? Ну можно постоянно писать комментарии и отвечать на вопросы.
    То есть я хочу сказать, что изначально целью моей регистрации было делиться опытом и спрашивать мнение других, а теперь мне вынужденно приходиться играть в карма-игры. Я понимаю, что таким образом я действительно уделяю намного больше внимания хабре, чем планировал. Хабра — получила мое 24/7 внимание, а я не получил то, за чем пришел сюда. Печально для меня, но эффективно для хабры.
    Ответ написан
    3 комментария
  • Как организовать рассылку так, чтобы не забанили

    Bartez
    @Bartez
    Тоже есть свой проект с рассылкой, но мне в день нужно рассылать до 500-та. писем.
    Отсыдаю их с интервалом в 61 сек (1 минута + 1 сек).
    Для проверки в этом потоке всегда шлю ещё на тестовый ящик на другом домене.
    Письма доходят всегда.

    Надеюсь эта информация будет вам полезна.
    Ответ написан
    1 комментарий