(ASP.NET) ASP NET (2010 год)

Делаем SEO SiteMap.

Необходимость ручного изготовления планов сайта (в противовес автоматическому обходу поисковиком) вызвана тем обстоятельством, что GOOGLE (и другие поисковики) обходят лишь 1000 страниц сайта. Между тем на сайте http://www.votpusk.ru/ за несколько месяцев работы зарегистрировалось шесть тысяч юзеров, некоторые из них (как вы можете увидеть на http://foto.votpusk.ru/ разместили более 500 фотографий (с комментариями и описанием), по каждой из сотен стран и отелей юзера разместили сотни рассказов, например более ста рассказов о путешествиях по Египту - всего более полумиллиона единиц контента. А автоматически ГУГЛ учитывает лишь 1000 тысячу страниц - 0,2% содержимого сайта!

На сайте http://www.interbooking.ru/ тоже содержится около 50 тысяч описаний отелей. Каждый из них описан тоже на нескольких страничках: фото, описание, отзывы и так далее. Та же самая ситауция - ГУГЛ индексирует мизернейшую часть общего контента сайта.

В некоторых отдельных случаях можно попробовать применить автоматический генератор Sitemap, например http://www.xml-sitemaps.com/ - однако для такого генератора требуется весьма специфическая структура сайта. Каждая страничка должна быть достижима из корня сайта, причем достижима по ссылкам, а не по нажатию кнопок или меню на активных сайтах. А второе органичение автоматических генераторов - если некой контент достижим по другому URL сайта (часто бестолковому, точно не характеризующему страну-отель например), то автогенератор произведет слияние URL и в итоговом плане сайта на нужную страничку будет ссылаться бестолковый URL. Кроме того, по реальным сайтам (от полмиллиона страниц и выше) ничего хорошего автогенератор не построит.

Поэтому, на практике, мне во всех моих сайтах пришлось выпускать вот такие планы сайтов для SEO:


   1:  <urlset>
   2:   <url>
   3:    <loc>http://story.votpusk.ru/story1.aspx?i=e17e5ad9-0207-42b3-bc65-9802f132d0ef&amp;j=3E355292208B92CA072A7CDC030AEADEA13C&amp;Country=EG&amp;Kurort=EG01&amp;Otel=EG010</loc>
   4:    <lastmod>2010-06-12</lastmod>
   5:    <changefreq>monthly</changefreq>
   6:    <priority>0.6</priority>
   7:   </url>
   8:   <url>
   9:    <loc>http://story.votpusk.ru/story1.aspx?i=7029a806-aca3-4175-aaf9-a53232a0d3ad&amp;j=22F90E7B9601BD090C097AF3EB38572BA13C&amp;Country=EG&amp;Kurort=EG01&amp;Otel=нет</loc>
  10:    <lastmod>2010-06-12</lastmod>
  11:    <changefreq>monthly</changefreq>
  12:    <priority>0.6</priority>
  13:   </url>
  14:  ....
  15:  </urlset>

   1:  <urlset>
   2:     <url>
   3:        <loc>http://www.interbooking.ru/ru/cities-AL.aspx</loc>
   4:        <lastmod>2010-02-28</lastmod>
   5:        <changefreq>weekly</changefreq>
   6:        <priority>0.6</priority>
   7:     </url>
   8:     <url>
   9:        <loc>http://www.interbooking.ru/ru/cities-AM.aspx</loc>
  10:        <lastmod>2010-02-28</lastmod>
  11:        <changefreq>weekly</changefreq>
  12:        <priority>0.6</priority>
  13:     </url>
  14:  ....
  15:  </urlset>

Метод выпуска плана сайта зависит от способа формирования URL странички:


Рассмотрим второй способ формирования плана сайта подробнее. Например для сайта Interbooking есть некая табличка (travco_hotels) кодержащая код отеля - на основании которой реврайтером формируется URL. Для такой схемы указанный выше план сайта может быть выпущен двумя вот такими простенькими процедурами - внешней и внутренней. Функция внешней процедуры - создание среды для работы внутренней процедуры и дробление плана по тысяче URL:

вы можете полностью применить эти процедуры для составления своих планов. Для этого замените в ней только курсор на свою табличку.


   1:  ALTER procedure [dbo].[CreateSiteMap2]
   2:  AS
   3:  --табла в которой будет итоговый SiteMap
   4:  Create TABLE [dbo].[#SITEMAP](
   5:      [i] [int] IDENTITY(1,1) NOT NULL,
   6:      [TXT] [nvarchar](500) NULL
   7:  ) ON [PRIMARY]
   8:  SET NOCOUNT ON
   9:  --табла для отсчета по 1000
  10:  Create TABLE [dbo].[#travco_hotel_code](
  11:      [i] [int] IDENTITY(1,1) NOT NULL,
  12:      [code] [nvarchar](3) NULL
  13:  ) ON [PRIMARY]
  14:   
  15:  insert #travco_hotel_code
  16:  SELECT  [hotel_code]
  17:  FROM [interbooking-4].[dbo].[travco_hotels]
  18:  group by [hotel_code]
  19:   
  20:   
  21:  Declare @HotelCount int, @StepCount int, @CurrentIndex int, @CurrentStep int, @InternalIndex int, @StopIndex int
  22:  Select  @StepCount=300, @CurrentIndex=1, @CurrentStep=1, @InternalIndex =1
  23:  select  @HotelCount=count(*) from #travco_hotel_code
  24:  while   @CurrentIndex<=@HotelCount BEGIN
  25:      print @CurrentStep 
  26:      print @CurrentIndex
  27:      print ''
  28:      select @InternalIndex=@CurrentIndex
  29:      if (@CurrentIndex+@StepCount<@HotelCount) Select @StopIndex=@CurrentIndex+@StepCount
  30:      else select @StopIndex=@HotelCount
  31:      Exec CreateSiteMapInternal1 @StartIndex=@InternalIndex, @StopIndex=@StopIndex
  32:      --While @InternalIndex<@CurrentIndex+@StepCount BEGIN
  33:      --    print  @InternalIndex
  34:      --    Exec CreateSiteMapInternal @InternalIndex=@InternalIndex
  35:      --    Select @InternalIndex=@InternalIndex+1
  36:      --    if (@InternalIndex>@HotelCount) GOTO EXIT1
  37:      --END
  38:      INSERT #SITEMAP SELECT ''
  39:      INSERT #SITEMAP SELECT ''
  40:      INSERT #SITEMAP SELECT ''
  41:      print '*'
  42:      select @CurrentStep=@CurrentStep+1, @CurrentIndex=@CurrentIndex+@StepCount
  43:  END
  44:  EXIT1:
  45:  --select * from #travco_hotel_code
  46:   
  47:  drop table #travco_hotel_code
  48:  SELECT TXT FROM [#SITEMAP] ORDER BY I
  49:  DROP TABLE #SITEMAP

А функция внутренней процедуры - непосредственно вычитывание кода отеля и формирование внешнего URL по коду, хранимому в базе - так же как этот URL формирует URL-реврайтер. Кроме того, у сайта имеется десяток статических страничек - я добавил их к автоматически генерируемым реврайтером страничками.


   1:  ALTER Procedure [dbo].[CreateSiteMapInternal1]
   2:  @StartIndex int,
   3:  @StopIndex int
   4:  as
   5:  INSERT #SITEMAP SELECT '<?xml version="1.0" encoding="utf-8" ?>' 
   6:  INSERT #SITEMAP SELECT '<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >'
   7:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/countries.aspx" title="Бронирование отелей."  description="Бронирование отелей.">'
   8:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/FAQ.aspx" title="Бронирование отелей. Вопросы и ответы."  description="Бронирование отелей. Вопросы и ответы." />'
   9:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Platite.aspx" title="Бронирование отелей. Оплата."  description="Бронирование отелей. Оплата." />'
  10:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/HowBooking.aspx" title="Бронирование отелей. Как забронировать." description="Бронирование отелей. Как забронировать." />'
  11:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/About.aspx" title="Бронирование отелей. О нас." description="Бронирование отелей. Как забронировать." />'
  12:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Rules.aspx" title="Бронирование отелей. Правила и условия бронирования." description="Бронирование отелей. Правила и условия бронирования." />'
  13:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Security.aspx" title="Бронирование отелей. Безопасность бронирования." description="Бронирование отелей. Безопасность бронирования." />'
  14:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/visa.aspx" title="Бронирование отелей. Визы." description="Бронирование отелей. Визы." />'
  15:  INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/countries.aspx" title="Бронирование отелей. Страны." description="Бронирование отелей. Страны." >'
  16:  DECLARE @Con_ID nvarchar(4), @Con_travco_code nvarchar(4), @Con_Name nvarchar(50), @country_en nvarchar(50), @Country_FETCH_STATUS int, @country_ru_rod nvarchar(50), @country_ru_pred nvarchar(50)
  17:  DECLARE CountryCursor CURSOR FOR 
  18:  SELECT id_countries, travco_code, country_ru, country_en , country_ru_rod from dbo.countries 
  19:  WHERE not (travco_code is null)
  20:  and EXISTS (SELECT country_code from dbo.travco_hotels where travco_hotels.country_code=countries.travco_code  group by country_code)
  21:  OPEN CountryCursor
  22:  FETCH NEXT FROM CountryCursor INTO @Con_ID, @Con_travco_code, @Con_Name ,@country_en, @country_ru_rod
  23:  SELECT @Country_FETCH_STATUS=@@FETCH_STATUS
  24:  WHILE  @Country_FETCH_STATUS = 0 BEGIN
  25:      PRINT 'ConID='+@Con_ID + ', Con_travco_code='+ @Con_travco_code + ', Con_Name ='+ @Con_Name   
  26:      INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/cities-'+ISNULL(@Con_ID,'')+'.aspx" title="Отели '+ISNULL(@country_ru_rod,'') +', онлайн бронирование отелей в '+ISNULL(@country_ru_rod,'')+', гостиницы '+ISNULL(@country_ru_rod,'')+', '+@country_en+' hotels- система бронирования отелей InterBooking.ru" description=" Бронирование отелей в '+ISNULL(@country_ru_rod,'')+', гостиницы '+ISNULL(@country_ru_rod,'')+', '+@country_en+' hotels reservation - онлайн бронирование отелей по всему миру с InterBooking.ru" >'
  27:      DECLARE @City_ID nvarchar(3), @City_countries_ID  nvarchar(4), @CityName varchar(50), @City_FETCH_STATUS int, @City_travco_code nvarchar(4), @city_en Varchar(30), @city_ru_rod nVarchar(50), @city_ru_pred nVarchar(50)
  28:      DECLARE CityCursor CURSOR FOR 
  29:      SELECT id_cities, id_countries ,city_ru, travco_code, city_en, city_ru_rod, city_ru_pred from dbo.cities  
  30:      WHERE dbo.cities.id_countries=  @Con_ID
  31:      and EXISTS (SELECT city_code from dbo.travco_hotels   
  32:      join #travco_hotel_code on #travco_hotel_code.code=travco_hotels.hotel_code
  33:      where travco_hotels.city_code=cities.id_cities and
  34:      #travco_hotel_code.i>@StartIndex and #travco_hotel_code.i<@StopIndex
  35:      group by city_code)
  36:      OPEN CityCursor
  37:      FETCH NEXT FROM CityCursor INTO @City_ID, @City_countries_ID, @CityName , @City_travco_code, @city_en, @city_ru_rod, @country_ru_pred
  38:      SELECT @City_FETCH_STATUS=@@FETCH_STATUS
  39:      WHILE @City_FETCH_STATUS = 0 BEGIN
  40:          PRINT 'CityID='+@City_ID + ', CityName='+ @CityName
  41:          INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/city-'+ISNULL(@City_ID,'')+'.aspx" title="Отели '+ISNULL(@city_ru_rod,'')+', онлайн бронирование отелей в '+ISNULL(@city_ru_pred,'')+', цены на гостиницы '+ISNULL(@city_ru_rod,'')+', '+ISNULL(@city_en,'')+' hotels - система бронирования отелей InterBooking.ru" description="Отели '+ISNULL(@city_ru_rod,'')+', фото, отзывы гостиниц '+ISNULL(@city_ru_rod,'')+', система онлайн бронирования отелей '+ISNULL(@city_ru_rod,'')+', '+ISNULL(@city_en,'')+' hotels- InterBooking.ru" >'
  42:          INSERT #SITEMAP SELECT ''
  43:          DECLARE @HotID nvarchar(4), @HotName nvarchar(50), @Hot_FETCH_STATUS int 
  44:          DECLARE HotCursor CURSOR FOR 
  45:          SELECT hotel_code, hotel_name from dbo.travco_hotels 
  46:          join #travco_hotel_code on #travco_hotel_code.code=dbo.travco_hotels.hotel_code
  47:          WHERE city_code= @City_travco_code and country_code=@Con_travco_code
  48:          and #travco_hotel_code.i>@StartIndex
  49:          and #travco_hotel_code.i<=@StopIndex 
  50:          OPEN HotCursor
  51:          FETCH NEXT FROM HotCursor INTO @HotID, @HotName
  52:          SELECT @Hot_FETCH_STATUS=@@FETCH_STATUS
  53:          WHILE @Hot_FETCH_STATUS = 0 BEGIN
  54:              PRINT 'HotID='+@HotID+', HotName=' +@HotName
  55:              INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-info-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&amp;')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
  56:              INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-comments-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&amp;')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
  57:              INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-prices-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&amp;')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&amp;')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
  58:              INSERT #SITEMAP SELECT ''
  59:              FETCH NEXT FROM HotCursor INTO @HotID, @HotName
  60:              SELECT @Hot_FETCH_STATUS=@@FETCH_STATUS
  61:          END
  62:          CLOSE HotCursor
  63:          DEALLOCATE HotCursor
  64:          INSERT #SITEMAP SELECT '</siteMapNode>'
  65:          FETCH NEXT FROM CityCursor INTO @City_ID,  @City_countries_ID, @CityName , @City_travco_code, @city_en, @city_ru_rod, @country_ru_pred
  66:          SELECT @City_FETCH_STATUS=@@FETCH_STATUS
  67:      END
  68:      CLOSE CityCursor
  69:      DEALLOCATE CityCursor
  70:      INSERT #SITEMAP SELECT '</siteMapNode>'
  71:      FETCH NEXT FROM CountryCursor INTO @Con_ID, @Con_travco_code, @Con_Name ,@country_en, @country_ru_rod
  72:      SELECT @Country_FETCH_STATUS=@@FETCH_STATUS
  73:  END
  74:  CLOSE CountryCursor
  75:  DEALLOCATE CountryCursor
  76:  INSERT #SITEMAP SELECT '</siteMapNode>'
  77:  INSERT #SITEMAP SELECT '</siteMapNode>'
  78:  INSERT #SITEMAP SELECT '</siteMap>'

Теперь рассмотрим третий способ формирования SEO SiteMap - кодом выше уровня СУБД. Я приведу пример SiteMap для ASP.NET-сайта, построенного на стандартных ASP.NET пользователях. Этот код вы можете использовать в своих проектах без изменения - лишь изменив текстовый литерал со своим доменом и названием странички.

Планы сайтов на стандартных ASP-NET пользователях, запоминаемых в aspnet_Users я делаю вот так: есть страничка, на которой размещается перечень пользователей (разбитый по тысяче пользователей) - при клике по линку всплывает форма с планов home-page указанной тысячи пользователей:


   1:  <%@ Page Language="VB" MasterPageFile="~/CMN/M2.master" AutoEventWireup="false" CodeFile="admin_SEO_users.aspx.vb"
   2:      Inherits="admin_SEO_users" %>
   3:   
   4:  <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
   5:      <asp:DataList ID="DataList1" runat="server" DataKeyField="StartNum" DataMember="DefaultView">
   6:          <ItemTemplate>
   7:              <a onclick="window.open('','SEO','resizable=yes,menubar=no,scrollbars=yes,width=600,height=700');"
   8:                  name='<%# Eval("StartNum") %> : <%#Eval("EndNum")%>' target='SEO' title='<%# Eval("StartNum") %> : <%#Eval("EndNum")%>'
   9:                  href="SeoUsers.ashx?StartNum=<%# Eval("StartNum") %>&EndNum=<%# Eval("EndNum") %>">
  10:                  <%# Eval("StartNum") %>
  11:                  :
  12:                  <%#Eval("EndNum")%>
  13:              </a>
  14:          </ItemTemplate>
  15:      </asp:DataList>
  16:      <asp:SqlDataSource ID="GetStoryPageCount" runat="server" ConnectionString="<%$ ConnectionStrings:SQLServer_ConnectionStrings %>"
  17:          SelectCommandType="Text" SelectCommand="select COUNT(*) as User_count from dbo.vw_aspnet_MembershipUsers">
  18:      </asp:SqlDataSource>
  19:  </asp:Content>

   1:  Partial Class admin_SEO_users
   2:      Inherits System.Web.UI.Page
   3:   
   4:      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   5:          If Not IsPostBack Then
   6:              Dim DV1 As Data.DataView = GetStoryPageCount.Select(New DataSourceSelectArguments)
   7:              If DV1 IsNot Nothing Then
   8:                  If DV1.Count > 0 Then
   9:                      Dim RowCount As Integer = DV1(0)("User_count")
  10:                      Dim EndPageNum As Integer = RowCount \ 1000 + 1
  11:                      Dim Dv2 As New Data.DataTable("Pager")
  12:                      Dv2.Columns.Add("StartNum", System.Type.GetType("System.Int32"))
  13:                      Dv2.Columns.Add("EndNum", System.Type.GetType("System.Int32"))
  14:                      For i = 0 To EndPageNum - 2
  15:                          Dv2.Rows.Add(i * 1000, (i + 1) * 1000)
  16:                      Next
  17:                      Dv2.Rows.Add((EndPageNum - 1) * 1000, RowCount - 1)
  18:                      DataList1.DataSource = Dv2
  19:                      DataList1.DataBind()
  20:                  End If
  21:              End If
  22:          End If
  23:      End Sub
  24:   
  25:  End Class

Как видите, все что делает эта страничка - это формирует строки таблицы по тысячу юзеров и формирует вызов хандлера. Никакой защиты для вызова хандлера не требуется - план сайта это несекретная информация. В хандрере формируется собственно XML плана сайта:


   1:  <%@ WebHandler Language="VB" Class="SeoUsers" %>
   2:   
   3:  Imports System
   4:  Imports System.Web
   5:   
   6:  Public Class SeoUsers : Implements IHttpHandler
   7:      
   8:      Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
   9:          Try
  10:              Dim CryptoStoryNumber As String
  11:              Dim DV1 As Data.DataView
  12:              Dim CN1 As New Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
  13:              CN1.Open()
  14:              Dim CMD1 As New Data.SqlClient.SqlCommand("GetUsersCount", CN1)
  15:              CMD1.CommandType = Data.CommandType.StoredProcedure
  16:              CMD1.Parameters.Add("StartNum", Data.SqlDbType.Int)
  17:              CMD1.Parameters.Add("EndNum", Data.SqlDbType.Int)
  18:              CMD1.Parameters("StartNum").Value = context.Request.QueryString("StartNum").Trim
  19:              CMD1.Parameters("EndNum").Value = context.Request.QueryString("EndNum").Trim
  20:              context.Response.ContentType = "text/plain"
  21:              context.Response.Write("<urlset>" & vbCrLf)
  22:              Dim DR1 As Data.SqlClient.SqlDataReader = CMD1.ExecuteReader
  23:              While DR1.Read
  24:                  context.Response.Write(" <url>" & vbCrLf)
  25:                  context.Response.Write("  <loc>")
  26:                  context.Response.Write("http://user.votpusk.ru/user_foto_all.aspx?i=" & DR1("UserID").ToString)
  27:                  context.Response.Write("</loc>" & vbCrLf)
  28:                  context.Response.Write("  <lastmod>" & Now.Year & "-" & Now.Month.ToString("00") & "-" & Now.Day.ToString("00") & "</lastmod>" & vbCrLf)
  29:                  context.Response.Write("  <changefreq>monthly</changefreq>" & vbCrLf)
  30:                  context.Response.Write("  <priority>0.6</priority>" & vbCrLf)
  31:                  context.Response.Write(" </url>" & vbCrLf)
  32:              End While
  33:              context.Response.Write("</urlset>" & vbCrLf)
  34:          Catch ex As Exception
  35:              context.Response.ContentType = "text/plain"
  36:              context.Response.Write(ex.Message)
  37:          End Try
  38:      End Sub
  39:   
  40:      Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
  41:          Get
  42:              Return False
  43:          End Get
  44:      End Property
  45:   
  46:  End Class

Для порядковго перечисления ASP.NET-юзеров в таблице без первичного последовательного ключа используется процедурка GetUsersCount:


   1:  ALTER procedure [dbo].[GetUsersCount]
   2:  @StartNum int =0,
   3:  @EndNum int=1000
   4:  as
   5:  with All_Users as
   6:  (
   7:  select ROW_NUMBER() over (order by CreateDate asc) as [ROW_NUMBER] , UserID from dbo.vw_aspnet_MembershipUsers
   8:  )
   9:  select * from All_Users where [ROW_NUMBER]>=@StartNum and [ROW_NUMBER]<@EndNum

Не забудьте, что для корректного использования встроенных в ASP.NET польователей (по которым и сформирован этот план) необходимо верно указать базу в строке коннекта LocalSqlServer и провайдера доступа к базе. Ключевой фрагмент web.config для доступа к стандартным пользователям ASP.NET для MS SQL вы можете видеть ниже:


   1:  ..........
   2:      <connectionStrings>
   3:          <remove name="LocalSqlServer"/>
   4:          <add name="LocalSqlServer" connectionString="server=VOTPUSK;Initial Catalog=vOtpusk_1;Max Pool Size=1000;User ID=XXXXXXXXXX;Password=YYYYYYYYYYYY" providerName="System.Data.SqlClient" />
   5:          <add name="SQLServer_ConnectionStrings" connectionString="server=VOTPUSK;Initial Catalog=vOtpusk_2;Max Pool Size=1000;User ID=XXXXXXXXXX;Password=YYYYYYYYYYYY" providerName="System.Data.SqlClient" />
   6:      </connectionStrings>
   7:      <system.web>
   8:          <sessionState mode="StateServer"/>
   9:          <authentication mode="Forms">
  10:              <forms defaultUrl="Login.aspx" slidingExpiration="true" enableCrossAppRedirects="true" domain="votpusk.ru"/>
  11:          </authentication>
  12:          <httpRuntime maxRequestLength="300000"/>
  13:          <roleManager enabled="true" defaultProvider="AspNetSqlProvider">
  14:              <providers>
  15:                  <remove name="AspNetSqlRoleProvider"/>
  16:                  <remove name="AspNetWindowsTokenRoleProvider"/>
  17:                  <add applicationName="/Votpusk" name="AspNetSqlProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="LocalSqlServer"/>
  18:              </providers>
  19:          </roleManager>
  20:          <membership>
  21:              <providers>
  22:                  <remove name="AspNetSqlMembershipProvider"/>
  23:                  <add applicationName="/Votpusk" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider,System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="False" requiresUniqueEmail="True" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="6" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
  24:              </providers>
  25:          </membership>
  26:          <profile defaultProvider="SqlProvider">
  27:              <providers>
  28:                  <clear/>
  29:                  <add applicationName="/Votpusk" name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlServer"/>
  30:              </providers>
  31:              <properties>
  32:                  <!-- Отложенная регистрация -->
  33:                  <add name="LoginIsActivate" type="System.Boolean"/>
  34:                  <add name="LoginActivateGUID" type="String"/>
  35:                  <add name="LoginClearDate" type="System.DateTime"/>
  36:                  <!-- Cвойства юзера c формы основной регистрации-->
  37:                  <add name="usNik" type="String"/>
  38:                  <add name="usShortName" type="String"/>
  39:                  <add name="usSex" type="String"/>
  40:                  <add name="usCountry" type="String"/>
  41:                  <add name="usTown" type="String"/>
  42:                  <add name="usBirth" type="System.DateTime"/>
  43:                  <!-- Cвойства юзера c формы дополнительный регистрации-->
  44:                  <add name="usAbout" type="String"/>
  45:  .............

Планы сайтов с криптографически-зашифрованными URL, как на http://www.votpusk.ru/ или на http://www.youtube.com/ - формируются ровно так же. Только обходить надо не стандартную табличку для хранения ASP.NET-пользователей aspnet_Users, а вашу собственную табличку. И, конечно, обрабатывать URL вашим криптографическим движком.



Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/SEO_SiteMap/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>