Jak stworzyć aplikację do głosowania w czasie rzeczywistym przy użyciu .NET i C#
Published: 2024-03-05 03:44:27

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](https://github.com/pubnub/c-sharp) 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](https://gist.github.com/stephenlb/a3fce3a43e1fba4564b6#schemas), 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:

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

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

Zapoznaj się z formatami tych schematów:

```js
<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>
```

```js
<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>
```

### 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#.

```js
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];
}
```

### 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.

```js
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();
            }
        }
    }
));
```

### Ł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:

```js
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;
}
```

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](https://www.pubnub.com/tour/introduction/) na żywo

### Konfiguracja

Aby rozpocząć tworzenie własnych aplikacji czasu rzeczywistego, zarejestruj [konto Pub](https://admin.pubnub.com/#/login)Nub.

### Rozpocznij

[Dokumenty](https://www.pubnub.com/docs) 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#](https://www.pubnub.com/docs/sdks/c-sharp), którego użyliśmy w tym samouczku.

#### Zawartość

[Schematy aplikacji do głosowania w czasie rzeczywistymPublikowanie](#h-0)[wiadomości](#h-1)[przez WebSockets](#h-3)[na potrzeby głosowania w czasie rzeczywistymSubskrybowanie](#h-1)[zgłoszeń użytkowników do głosowania w czasie rzeczywistym przez WebSocketsWczytywanie](#h-2)[historii wiadomości przez WebSockets na potrzeby pulpitu nawigacyjnego głosowania w czasie](#h-3)[rzeczywistymPodsumowaniePoczątekPoznaj](#h-5)[PubNubPoznaj](#h-6)[konfiguracjęPoczątek](#h-8)

Jak PubNub może ci pomóc?
=========================

Ten artykuł został pierwotnie opublikowany na PubNub [.com](https://www.pubnub.com/blog/how-to-build-a-realtime-voting-app-with-net-and-c/)

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](https://www.pubnub.com/tour/introduction/), aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację
-----------------------

Załóż [konto](https://admin.pubnub.com/signup/) PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij
----------

[Dokumenty](https://www.pubnub.com/docs) PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub [zestawu SDK](https://www.pubnub.com/docs).