Więc grałem z tym trochę na podstawie komentarzy tutaj. To, co wymyśliłem, polega na liczeniu kontuaru w prostej dziedzinie. W mojej aplikacji mam elementy kodu ułamkowego z właściwością Wyświetlenia.
Kiedy fragment jest postrzegane metodę odfiltrowuje (biała lista) właśnie co powinno miejmy nadzieję przeglądarek:
public bool LogSnippetView(string snippetId, string ipAddress, string userAgent)
{
if (string.IsNullOrEmpty(userAgent))
return false;
userAgent = userAgent.ToLower();
if (!(userAgent.Contains("mozilla") || !userAgent.StartsWith("safari") ||
!userAgent.StartsWith("blackberry") || !userAgent.StartsWith("t-mobile") ||
!userAgent.StartsWith("htc") || !userAgent.StartsWith("opera")))
return false;
this.Context.LogSnippetClick(snippetId, IpAddress);
}
Procedura składowana następnie wykorzystuje oddzielny stolik tymczasowo posiadają najnowsze poglądy, które przechowują fragment Id , wprowadzona data i adres IP. Każdy widok jest rejestrowany i kiedy pojawia się nowy widok, jest on sprawdzany, aby sprawdzić, czy ten sam adres IP uzyskał dostęp do tego fragmentu w ciągu ostatnich 2 minut. jeśli tak, nic nie jest rejestrowane.
Jeśli jest to nowy widok, widok jest rejestrowany (ponownie SnippetId, IP, Wprowadzony), a rzeczywiste pole Widoki jest aktualizowane w tabeli Snippet.
Jeśli nie jest to nowy widok, tabela jest czyszczona przy wszystkich zarejestrowanych widokach starszych niż 4 minuty. Powinno to spowodować w dowolnym momencie minimalną liczbę wpisów w tabeli dziennika widoku.
Oto przechowywane proc:
ALTER PROCEDURE [dbo].[LogSnippetClick]
-- Add the parameters for the stored procedure here
@SnippetId AS VARCHAR(MAX),
@IpAddress AS VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
-- check if don't allow updating if this ip address has already
-- clicked on this snippet in the last 2 minutes
select Id from SnippetClicks
WHERE snippetId = @SnippetId AND ipaddress = @IpAddress AND
DATEDIFF(minute, Entered, GETDATE()) < 2
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO SnippetClicks
(SnippetId,IpAddress,Entered) VALUES
(@SnippetId,@IpAddress,GETDATE())
UPDATE CodeSnippets SET VIEWS = VIEWS + 1
WHERE id = @SnippetId
END
ELSE
BEGIN
-- clean up
DELETE FROM SnippetClicks WHERE DATEDIFF(minute,Entered,GETDATE()) > 4
END
END
Wydaje się to dość dobrze. Jak wspomnieli inni, nie jest to doskonałe, ale wygląda na to, że jest wystarczająco dobre w początkowych testach.
Zadajesz bardzo trudne pytanie. Wystarczy pomyśleć o tym, jak Google radzi sobie z problemem mfraud click, a dowiesz się, jak duży może być odpowiedź na twoje pytanie. – backslash17
Zgadzam się .. nie jest to łatwy problem .. chociaż zawsze zastanawiałem się dlaczego serwery sieciowe nie oferują dobrych rozwiązań analitycznych. Mówię "policz" Google Analytics i zadzwoń do niego, chyba że próbujesz odkryć na nowo złamane koło. – madcolor
Zrozumiałem, ale właśnie dlatego proszę tutaj: -}. Naprawdę nie jestem tu po analizie, ale licznik podobny do tego na SO, aby pokazać liczbę wyświetleń przynajmniej częściowo niezawodnie. –