Jak stworzyć aplikację do głosowania w czasie rzeczywistym przy użyciu .NET i C#

PubNub Developer Relations - Mar 5 - - Dev Community

Możesz łatwo zbudować aplikację do głosowania w czasie rzeczywistym w przeglądarce za pomocą C# i .NET, umożliwiając użytkownikom głosowanie i przeglądanie wyników, aktualizowanych w czasie rzeczywistym. Jest to aplikacja internetowa, która zapewnia funkcjonalność systemu głosowania w czasie rzeczywistym. Biorąc pod uwagę szybki postęp technologiczny, ważne jest, aby dotrzymać kroku i w tym celu chciałbym wspomnieć, że w tym samouczku używamy C# 9, ASP.NET 5.0 i PubNub C# SDK w wersji 4.4.0.

W tym samouczku pokażemy, jak stworzyć internetową aplikację do głosowania w czasie rzeczywistym przy użyciu C# PubNub API i ASP.NET MCV4, części Microsoft ASP.NET Core Web API. Umożliwi to użytkownikom głosowanie, a wyniki będą automatycznie podliczane i wyświetlane w czasie rzeczywistym dzięki PubNub C# SDK. W szczególności wykorzystamy metody publish()\, Subscribe()\ i DetailedHistory\, aby zasilić naszą aplikację do głosowania w czasie rzeczywistym. Kod źródłowy można znaleźć na GitHub.

W każdej aplikacji czasu rzeczywistego przewidujemy, że pytanie i wybór odpowiedzi/odpowiedzi będą pochodzić z zaplecza, takiego jak baza danych serwera SQL przy użyciu struktury encji. Aby zawęzić nasze zainteresowania w tym samouczku, będę twardo kodował pytania i opcje odpowiedzi w metodzie GetActivePollQuestion()\ klasy SampleData\, renderując je jako ciągi xml. W prawdziwym scenariuszu chciałbyś zwrócić dynamiczne dane jako ciąg xml.

Schematy dla aplikacji do głosowania w czasie rzeczywistym

W tym kontekście schematy torują drogę do zorganizowanego i ustrukturyzowanego przechowywania danych, umożliwiając wydajne operacje obsługi danych. Aby osiągnąć nasze cele, utworzono dwa schematy, PollQuestion.xsd i PollUserAnswer.xsd. Zapewniają one plan dla naszych danych, określając strukturę i typ przechowywanych informacji.

Odpowiednie pliki klas, PollQuestion.cs i PollUserAnswer.cs, zostały wygenerowane przy użyciu następujących poleceń w terminalu Visual Studio za pomocą narzędzia xsd.exe:

XSD.EXE PollQuestion.xsd /c /l:cs /n:ePoll.Types

XSD.EXE PollUserAnswer.xsd /c /l:cs /n:ePoll.Types
Enter fullscreen mode Exit fullscreen mode

Zapoznaj się z formatami tych schematów:

<xs:schema id="PollQuestion"
    targetNamespace="pubnub-csharp-demo-epoll-1.0"
    elementFormDefault="qualified"
    xmlns="pubnub-csharp-demo-epoll-1.0"
    xmlns:mstns="pubnub-csharp-demo-epoll-1.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="PollQuestion">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ID" type="xs:string"></xs:element>
        <xs:element name="Question" type="xs:string"></xs:element>
        <xs:element name="Active" type="xs:boolean"></xs:element>
        <xs:element name="AnswerGroup">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Answer" type="xs:string" maxOccurs="unbounded" minOccurs="2"></xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Enter fullscreen mode Exit fullscreen mode
<xs:schema id="PollUserAnswer"
    targetNamespace="pubnub-csharp-demo-epoll-1.0"
    elementFormDefault="qualified"
    xmlns="pubnub-csharp-demo-epoll-1.0"
    xmlns:mstns="pubnub-csharp-demo-epoll-1.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="PollUserAnswer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="QuestionID" type="xs:string"></xs:element>
        <xs:element name="Question" type="xs:string"></xs:element>
        <xs:element name="UserAnswer" type="xs:string"></xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
Enter fullscreen mode Exit fullscreen mode

Publikowanie wiadomości przez WebSockets dla głosowania w czasie rzeczywistym

Metoda Publish()\ odgrywa kluczową rolę w naszej aplikacji do głosowania w czasie rzeczywistym, ponieważ służy do wysyłania odpowiedzi ankietowych do określonego kanału PubNub. Wiadomość ta jest następnie odbierana przez wszystkie instancje subskrybujące ten kanał w czasie rzeczywistym, ułatwiając interaktywne głosowanie. Możesz łatwo skonfigurować tę operację za pomocą następującego segmentu kodu C#.

public bool SaveAnswer(PollUserAnswer answer)
{
    bool ret = false;

    string pubnubChannel = answer.QuestionID;
    mrePublish.AddOrUpdate(pubnubChannel, new ManualResetEvent(false), (key, oldState) => new ManualResetEvent(false));
    messagePublished[pubnubChannel] = false;

    pubnub.Publish().Channel(pubnubChannel).Message(answer.UserAnswer)
        .Execute(new PNPublishResultExt(
            (result, status) => {
                if (!status.Error && result != null)
                {
                    messagePublished[pubnubChannel] = true;
                    mrePublish[pubnubChannel].Set();
                }
            }));

    mrePublish[pubnubChannel].WaitOne(TimeSpan.FromSeconds(10));

    return messagePublished[pubnubChannel];
}
Enter fullscreen mode Exit fullscreen mode

Subskrybowanie zgłoszeń użytkowników do głosowania w czasie rzeczywistym za pośrednictwem WebSockets

Po drugiej stronie równania, metoda Subscribe()\ jest używana do odbierania odpowiedzi na ankiety w czasie rzeczywistym. Umożliwia to naszej aplikacji dostarczanie aktualizacji w czasie rzeczywistym. PubNub SDK może automatycznie odzyskać każdą wiadomość / łącze, które zostało porzucone przy użyciu długiego odpytywania wśród innych protokołów. Aby uzyskać tę funkcjonalność w kodzie C#, można dodać następujący fragment kodu.

pubnub.Subscribe<string>()
    .Channels(new List<string> { pubnubChannel })
    .WithPresence() // If you need presence feature
    .Execute();

// Handling messages, presence, and status within the subscription listener
pubnub.AddListener(new SubscribeCallbackExt(
    (pubnubObj, message) => {
        if (message != null)
        {
            Console.WriteLine("VOTE RECEIVED!");
            Console.WriteLine(message.Message);
            Console.WriteLine();
        }
    },
    (pubnubObj, presence) => {
        // Handle presence event if needed
    },
    (pubnubObj, status) => {
        if (status != null)
        {
            if (status.Category == PNStatusCategory.PNConnectedCategory)
            {
                Console.WriteLine("SUBSCRIBE CONNECT CALLBACK:");
                Console.WriteLine(status.Category.ToString());
                Console.WriteLine();
            }
            else if (status.Error)
            {
                Console.WriteLine();
                Console.WriteLine(status.ErrorData.Information);
                Console.WriteLine();
            }
        }
    }
));
Enter fullscreen mode Exit fullscreen mode

Ładowanie historii wiadomości przez WebSockets dla pulpitu głosowania w czasie rzeczywistym

Metoda DetailedHistory\ pobiera historyczne wiadomości z kanału. Metoda ta pobiera te wiadomości asynchronicznie, pozwalając nam zobaczyć historię danych głosowania z określonego kanału PubNub. Oto segment kodu, który to demonstruje:

public async Task<List<string>> GetPollResultsAsync(string questionID)
{
    List<string> ret = new List<string>();

    string pubnubChannel = questionID;
    long startTimetoken = 0; // For fetching all messages. Adjust as needed.

    try
    {
        PNHistoryResult result = await pubnub.History()
            .Channel(pubnubChannel)
            .Start(startTimetoken)
            .Count(100) // Adjust based on how many messages you expect to fetch. Max usually 100.
            .IncludeTimetoken(true)
            .ExecuteAsync();

        if (result != null && result.Messages != null)
        {
            foreach (var message in result.Messages)
            {
                // Assuming the messages are strings. Adjust as necessary for your data format.
                ret.Add(message.Entry.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
        // Handle errors or exceptions as necessary.
    }

    return ret;
}
Enter fullscreen mode Exit fullscreen mode

Podsumowanie

Do tej pory powinieneś dobrze rozumieć, jak zbudować aplikację do głosowania w czasie rzeczywistym przy użyciu C#, .NET i PubNub C# SDK. Jeśli dokładnie prześledziłeś ten samouczek, zauważyłeś, jak łatwo jest zintegrować funkcje czasu rzeczywistego z aplikacjami za pomocą PubNub.

W następnym wpisie na blogu pójdziemy o krok dalej, włączając dodatkowe funkcje, takie jak Angular na frontendzie, dodając uwierzytelnianie użytkowników, konfigurując szyfrowanie danych i wiele więcej. Bądź na bieżąco z naszą playlistą samouczków dotyczących tworzenia stron internetowych!

Pierwsze kroki

Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT. Jest ona szczególnie przydatna do tworzenia aplikacji do głosowania w czasie rzeczywistym, takich jak ta, którą omówimy w tym samouczku.

Fundamentem naszej platformy jest największa w branży i najbardziej skalowalna brzegowa sieć przesyłania wiadomości w czasie rzeczywistym. Możesz na nas polegać, jeśli chodzi o solidne, wysokowydajne rozwiązania.

Poznaj PubNub

Wycieczka na żywo

Konfiguracja

Aby rozpocząć tworzenie własnych aplikacji czasu rzeczywistego, zarejestruj konto PubNub.

Rozpocznij

Dokumenty PubNub służą pomocą bez względu na to, co tworzysz. Oferujemy obszerne przewodniki dla różnych przypadków użycia i zestawów SDK, w tym C#, którego użyliśmy w tym samouczku.

Zawartość

Schematy aplikacji do głosowania w czasie rzeczywistymPublikowaniewiadomościprzez WebSocketsna potrzeby głosowania w czasie rzeczywistymSubskrybowaniezgłoszeń użytkowników do głosowania w czasie rzeczywistym przez WebSocketsWczytywaniehistorii wiadomości przez WebSockets na potrzeby pulpitu nawigacyjnego głosowania w czasierzeczywistymPodsumowaniePoczątekPoznajPubNubPoznajkonfiguracjęPoczątek

Jak PubNub może ci pomóc?

Ten artykuł został pierwotnie opublikowany na PubNub .com

Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT.

Podstawą naszej platformy jest największa w branży i najbardziej skalowalna sieć komunikacyjna w czasie rzeczywistym. Dzięki ponad 15 punktom obecności na całym świecie obsługującym 800 milionów aktywnych użytkowników miesięcznie i niezawodności na poziomie 99,999%, nigdy nie będziesz musiał martwić się o przestoje, limity współbieżności lub jakiekolwiek opóźnienia spowodowane skokami ruchu.

Poznaj PubNub

Sprawdź Live Tour, aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację

Załóż konto PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij

Dokumenty PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub zestawu SDK.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .