Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ebben a rövid útmutatóban egy asztali Windows alkalmazást fog létrehozni, amely leküldéses értesítéseket küld és fogad a Windows App SDK használatával.
Prerequisites
- Start Windows alkalmazások fejlesztése
- Vagy hozzon létre egy új projektet, amely a Windows App SDK-t használja VAGY használja a Windows App SDK-t egy meglévő projektben
- Windows App SDK leküldéses értesítések használatához Azure fiókra van szükség.
- Olvassa el a leküldéses értesítések áttekintését
Csomagolási követelmények
A Windows App SDK-ben a push értesítések támogatják mind a csomagolt, mind a csomagolatlan asztali alkalmazásokat. A csomagazonosítóra szükség van a háttérkézbesítés és a COM-aktiválás érdekében – ez a leggyakoribb gyártási környezet. Az alábbi táblázat a csomagolási modell alapján összefoglalja a szükséges tudnivalókat:
| Csomagolási modell | COM-aktivátor szükséges | Szükséges a PFN megfeleltetés | Csomagolatlan támogatás |
|---|---|---|---|
| MSIX csomagolva (WinUI 3, csomagolt WPF/WinForms) | Igen – a Package.appxmanifest |
Igen – PFN-leképezési e-mailben | No |
| Csomagolva külső hellyel | Igen – a Package.appxmanifest |
Igen – PFN-leképezési e-mailben | No |
| Valóban csomagolatlan (nincs csomagazonosság) | Nem (3. lépés kihagyása) | No | Igen – korlátozott funkciók |
Important
Ha az alkalmazás csomagolva van (MSIX vagy külső helyen csomagolt), akkor le kell képeznie az alkalmazás Package Family Name (PFN)-ját az Azure AppId-hoz, mielőtt a leküldéses értesítések működni fognak. A leképezési kérelmeket e-mailben küldjük el Win_App_SDK_Push@microsoft.com , és heti rendszerességgel dolgozzuk fel. Tervezze meg ezt az átfutási időt az indítás előtt.
A részletekért lásd a 4. lépést: Az alkalmazás csomagcsalád-nevének és az Azure AppId-nak a leképezése.
Mintaalkalmazás
Ez a rövid útmutató végigvezeti a leküldéses értesítések támogatásának hozzáadásán az alkalmazáshoz az Windows App SDK 1.7-en. Hasonló kódot talál ehhez a rövid útmutatóhoz a GitHub-on található mintaalkalmazásokban. Ellenőrizze az ágat a preferált verziójával a Windows App SDK-nak, hogy megtalálja a legjobban illeszkedő mintákat a projektjéhez.
A Windows App SDK egyes verzióihoz is találhat mintákat a a mintatárban lévő verzióág kiválasztásával.
API-referencia
A push értesítések API-referenciadokumentációját lásd a Microsoft.Windows.PushNotifications Névtér alatt.
Az alkalmazás identitásának konfigurálása Azure Active Directory (AAD)
Windows App SDK push értesítések az Azure Active Directory (AAD) identitásokat használnak. Azure hitelesítő adatokra van szükség a WNS-csatorna URI-igényléséhez és a hozzáférési jogkivonatok igényléséhez, hogy leküldéses értesítéseket küldhessünk. Megjegyzés: A Windows App SDK push leküldéses értesítéseket nem támogatjuk a Microsoft Partnerközpontrel.
1. lépés: AAD-alkalmazásregisztráció létrehozása
Jelentkezzen be Azure fiókjába, és hozzon létre egy új AAD-alkalmazásregisztráció erőforrást. Válassza Új regisztráció.
2. lépés: Adjon meg egy nevet, és válasszon egy több-bérlős lehetőséget
Adja meg az alkalmazás nevét.
Az push értesítésekhez több-bérlős beállítás szükséges, ezért válassza ezt.
- További információ a bérlőkről: Ki tud bejelentkezni az alkalmazásba?
Válassza Regisztrálás
Jegyezze fel a Alkalmazás (ügyfél) azonosítóját, mivel ez a Azure AppId amelyet az aktiválási regisztráció és a hozzáférési jogkivonat-kérés során fog használni.
Jegyezze fel a Directory (bérlő) azonosítóját, mivel ez a Azure TenantId, amelyet a hozzáférési jogkivonat kérésekor fog használni.
Important
Jegyezze fel az alkalmazás (ügyfél) azonosítóját és címtár (bérlő) azonosítóját.Jegyezze fel a Object azonosítóját, mivel ez a Azure ObjectId, amelyet a csatornakérelem kérésekor fog használni. Vegye figyelembe, hogy ez NEM az Alapvető fontosságúk lapon felsorolt objektumazonosító. Ehelyett a megfelelő objektumazonosító megkereséséhez kattintson a Felügyelt alkalmazás nevére az Essentials lap helyi könyvtár mezőjében:
Note
Egy szolgáltatásnév szükséges az objektumazonosító lekéréséhez, ha nincs társítva az alkalmazáshoz, kövesse az alábbi cikkek egyikének lépéseit, hogy létrehozhasson egyet a Azure portálon vagy a parancssorban:
Az Azure PowerShell használata egy szolgáltatási főszereplő létrehozásához tanúsítvánnyal
3. lépés: Titkos kód létrehozása az alkalmazásregisztrációhoz
Az Ön titkos kulcsát az Azure AppId/ClientId azonosítóval együtt fogják használni, amikor hozzáférési jogkivonatot kér push értesítések küldéséhez.
Lépjen a Tanúsítványok > titkos kódok elemre , és válassza az Új ügyfélkód lehetőséget.
Important
Győződjön meg arról, hogy a titkos kulcsot a létrehozás után másolja, és biztonságos helyen tárolja, például Azure Key Vault. Csak egyszer lesz megtekinthető közvetlenül a létrehozás után.
4. lépés: Az alkalmazás csomagcsaládjának leképezése a Azure AppId azonosítójára
Ha az alkalmazás csomagolva van (például külső hellyel együtt van csomagolva), ezzel a folyamattal megfeleltetheti az alkalmazás Csomagcsalád nevét (PFN) és az Azure AppId azonosítóját.
Ha az alkalmazás egy csomagolt Win32-alkalmazás, akkor hozzon létre egy Package Family Name (PFN) leképezési kérelmet az Win_App_SDK_Push@microsoft.com e-mail címre küldött üzenetben, "Windows App SDK Push Notifications Mapping Request" tárggyal, és a következő tartalommal: "PFN: [a PFN]", AppId: [az APPId], ObjectId: [az ObjectId]. A leképezési kérelmek heti rendszerességgel befejeződnek. A leképezési kérelem befejezése után értesítést kap.
Ha már rendelkezik Azure AppId, ObjectId és Titkos azonosítóval, hozzáadhatja ezeket a hitelesítő adatokat az alábbi mintakódhoz.
Az alkalmazás konfigurálása leküldéses értesítések fogadásához
1. lépés: Windows App SDK és szükséges NuGet-csomagok hozzáadása
Ezután kattintson a jobb gombbal a megoldásra a Megoldáskezelő, és válassza a Manage NuGet Packages lehetőséget.
A Csomagkezelő adja hozzá a következő csomagokat:
- Microsoft. WindowsAppSDK (legalább 1.1.0-s verzió)
- Microsoft. Windows. SDK. BuildTools (minimum 10.0.22000.194-es verzió)
- Microsoft. Windows. CppWinRT, (minimum 2.0.210930.14-es verzió)
- Microsoft. Windows. ImplementLibrary, (minimum 1.0.210930.1-es verzió)
Ha ez az első alkalom, hogy Windows App SDK-t használ a projektben, és külső helyről van csomagolva, vagy nincs csomagolva, inicializálnia kell a Windows App SDK-t a következő tulajdonság hozzáadásával a projektfájlban.
<!-- your .vcxproj or .proj file -->
<PropertyGroup Label="Globals">
<!-- Other properties -->
<WindowsPackageType>None</WindowsPackageType>
</PropertyGroup>
vagy használja a bootstrapper API-t. További részletekért lásd: Az Windows App SDK futtatókörnyezet használata külső helyen vagy csomagolatlanként csomagolt alkalmazásokhoz.
Note
Ha az SDK nincs inicializálva, az alkalmazás dobni System.Runtime.InteropServices.COMException (0x80040154): Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)) fog, és nem fog futni.
2. lépés: Névterek hozzáadása
Ezután adja hozzá Windows App SDK leküldéses értesítések névterét Microsoft.Windows.PushNotifications.
#include <winrt/Microsoft.Windows.PushNotifications.h>
using namespace winrt::Microsoft::Windows::PushNotifications;
Ha megjelenik egy "Nem találja a Microsoft.Windows.PushNotifications" hiba, az valószínűleg azt jelenti, hogy a fejlécfájlok nem lettek létrehozva. A megoldáshoz győződjön meg arról, hogy a fenti csomagok telepítve vannak, kommentelje ki a hiba okozó include és using nyilatkozatokat, és építse újra az alkalmazást a fejlécfájlok létrehozásához. Ha a build sikeres, távolítsa el a megjegyzés jeleket az include és a using utasítások mellől, majd építse újra a projektet. Ennek meg kell oldania a hibát.
3. lépés: COM-aktivátor hozzáadása az alkalmazás jegyzékfájljához
Important
Ha az alkalmazás ki van csomagolva (vagyis futásidőben nem rendelkezik csomagidentitással), ugorjon a 4. lépésre: Regisztráljon és válaszoljon a leküldéses értesítésekre az alkalmazás indításakor.
Ha az alkalmazás csomagolva van (beleértve a külső helyre való csomagolást is): Nyissa meg a Package.appxmanifest. Adja hozzá az alábbi elemeket az elemhez <Application> . Cserélje le a Id, Executableés DisplayName az értékeket az alkalmazásra jellemző értékekre.
<!--Packaged apps only-->
<!--package.appxmanifest-->
<Package
...
xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
...
<Applications>
<Application>
...
<Extensions>
<!--Register COM activator-->
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:ExeServer Executable="SampleApp\SampleApp.exe" DisplayName="SampleApp" Arguments="----WindowsAppRuntimePushServer:">
<com:Class Id="[Your app's Azure AppId]" DisplayName="Windows App SDK Push" />
</com:ExeServer>
</com:ComServer>
</com:Extension>
</Extensions>
</Application>
</Applications>
</Package>
Note
A Id<com:Class> attribútumot a Azure AppId értékre kell beállítani (az alkalmazás (ügyfél) azonosító az Azure AD alkalmazás-regisztrációból). Így csatlakoztatja Windows App SDK az alkalmazás COM-aktiválását annak Azure identitásához – amikor a WNS aktiválja az alkalmazást egy háttérbeli leküldéses értesítés küldéséhez, ez a GUID használatával megkeresi és elindítja a megfelelő COM-kiszolgálót. Használja ugyanazt a Azure AppId-értéket, amelyet a fenti 1. lépésben feljegyzett.
Note
Ebben a példában megtalálható a C++ osztály teljes változata az 5. lépés után. A 4. és az 5. lépés lépésenkénti útmutatást nyújt az egyes elemek hozzáadásához az utolsó példában.
4. lépés: Regisztrálj és válaszolj a leküldéses értesítésekre az alkalmazás indításakor
Frissítse az alkalmazás metódusát main() a következők hozzáadásához:
- Regisztrálja az alkalmazást a PushNotificationManager::Default().Register()hívásával, hogy leküldéses értesítéseket fogadhasson.
- Ellenőrizze az aktiválási kérelem forrását az AppInstance::GetCurrent() hívásával. GetActivatedEventArgs(). Ha az aktiválást leküldéses értesítés által történt, az értesítés tartalma alapján válaszoljon.
Important
Meg kell hívnod PushNotificationManager::Default().Regisztrálj, mielőtt meghívod AppInstance.GetCurrent.GetActivatedEventArgs.
Előtérben lévő eseménykezelők hozzáadása
Az előtérben lévő események kezeléséhez regisztráljon egy kezelőt a PushNotificationManager.PushReceived fájlhoz.
Important
A PushNotificationManager.PushReceived eseménykezelőket is regisztrálnia kell a PushNotificationManager.Register() hívása előtt. Ellenkező esetben a következő futásidejű kivétel jelenik meg:
System.Runtime.InteropServices.COMException: Element not found. Must register event handlers before calling Register().
Adja hozzá az PushNotificationManager::IsSupported() ellenőrzését
Ezután adjon hozzá egy ellenőrzést, hogy a PushNotification API-k támogatottak-e a PushNotificationManager.IsSupported() használatával. Ha nem, javasoljuk, hogy használjon lekérdezést vagy saját egyéni socket implementációt.
Most, hogy már megerősítették a leküldéses értesítések támogatását, adjon hozzá viselkedést a PushNotificationReceivedEventArgs alapján.
5. lépés: WNS Channel URI kérése és regisztrálása a WNS-kiszolgálón
A push értesítések küldésére szolgáló HTTP-végpontok a WNS csatorna URI-k. A leküldéses értesítések fogadásához minden ügyfélnek csatorna URI-t kell kérnie, és regisztrálnia kell azt a WNS-kiszolgálón.
Note
A WNS Channel URI-k 30 nap után lejárnak. Új csatorna URI igénylése minden alkalmazás indításakor ahelyett, hogy az előzőt gyorsítótárazná. Ha az új URI eltér attól, amit a háttérrendszer tárolt, küldje el a frissített URI-t a felhőszolgáltatásnak, hogy naprakészen tarthassa a rekordjait. Ne feltételezze, hogy az URI stabil marad a munkamenetek között — mutálható munkamenet-hatókörű értékként kezelve elkerülhetők a lejárt vagy elavult csatorna URI-k által okozott csendes kézbesítési hibák.
auto channelOperation{ PushNotificationManager::Default().CreateChannelAsync(winrt::guid("[Your app's Azure ObjectID]")) };
Ha követi az oktatóanyag kódját, adja hozzá a Azure objektumazonosítóját:
// To obtain an AAD RemoteIdentifier for your app,
// follow the instructions on https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app
winrt::guid remoteId{ "00000000-0000-0000-0000-000000000000" }; // Replace this with your own Azure ObjectId
A PushNotificationManager megpróbál létrehozni egy csatorna URI-t, és legfeljebb 15 percig automatikusan próbálkozik. Hozzon létre egy eseménykezelőt, hogy megvárja a hívás befejezését. Ha a hívás befejeződött, regisztrálja az URI-t a WNS-kiszolgálón.
Példakód
#include <iostream>
#include <winrt/Microsoft.Windows.PushNotifications.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Microsoft.Windows.AppLifecycle.h>
#include <winrt/Windows.ApplicationModel.Background.h>
#include <wil/cppwinrt.h>
#include <wil/result.h>
using namespace winrt::Microsoft::Windows::PushNotifications;
using namespace winrt::Windows::Foundation;
using namespace winrt::Microsoft::Windows::AppLifecycle;
// To obtain an AAD RemoteIdentifier for your app,
// follow the instructions on https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app
winrt::guid remoteId{ "00000000-0000-0000-0000-000000000000" }; // Replace this with your own Azure ObjectId
winrt::Windows::Foundation::IAsyncOperation<PushNotificationChannel> RequestChannelAsync()
{
auto channelOperation = PushNotificationManager::Default().CreateChannelAsync(remoteId);
// Set up the in-progress event handler
channelOperation.Progress(
[](auto&& sender, auto&& args)
{
if (args.status == PushNotificationChannelStatus::InProgress)
{
// This is basically a noop since it isn't really an error state
std::cout << "Channel request is in progress." << std::endl << std::endl;
}
else if (args.status == PushNotificationChannelStatus::InProgressRetry)
{
LOG_HR_MSG(
args.extendedError,
"The channel request is in back-off retry mode because of a retryable error! Expect delays in acquiring it. RetryCount = %d",
args.retryCount);
}
});
auto result = co_await channelOperation;
if (result.Status() == PushNotificationChannelStatus::CompletedSuccess)
{
auto channelUri = result.Channel().Uri();
std::cout << "channelUri: " << winrt::to_string(channelUri.ToString()) << std::endl << std::endl;
auto channelExpiry = result.Channel().ExpirationTime();
// Caller's responsibility to keep the channel alive
co_return result.Channel();
}
else if (result.Status() == PushNotificationChannelStatus::CompletedFailure)
{
LOG_HR_MSG(result.ExtendedError(), "We hit a critical non-retryable error with channel request!");
co_return nullptr;
}
else
{
LOG_HR_MSG(result.ExtendedError(), "Some other failure occurred.");
co_return nullptr;
}
};
PushNotificationChannel RequestChannel()
{
auto task = RequestChannelAsync();
if (task.wait_for(std::chrono::seconds(300)) != AsyncStatus::Completed)
{
task.Cancel();
return nullptr;
}
auto result = task.GetResults();
return result;
}
void SubscribeForegroundEventHandler()
{
winrt::event_token token{ PushNotificationManager::Default().PushReceived([](auto const&, PushNotificationReceivedEventArgs const& args)
{
auto payload{ args.Payload() };
std::string payloadString(payload.begin(), payload.end());
std::cout << "\nPush notification content received in the FOREGROUND: " << payloadString << std::endl;
}) };
std::cout << "Push notification foreground event handler registered." << std::endl;
}
int main()
{
// Set up an event handler, so we can receive notifications in the foreground while the app is running.
// You must register notification event handlers before calling Register(). Otherwise, the following runtime
// exception will be thrown: System.Runtime.InteropServices.COMException: 'Element not found. Must register
// event handlers before calling Register().'
SubscribeForegroundEventHandler();
// Register the app for push notifications.
PushNotificationManager::Default().Register();
auto args{ AppInstance::GetCurrent().GetActivatedEventArgs() };
switch (args.Kind())
{
case ExtendedActivationKind::Launch:
{
std::cout << "App launched by user or from the debugger." << std::endl;
if (PushNotificationManager::IsSupported())
{
std::cout << "Push notifications are supported on this device." << std::endl;
// Request a WNS Channel URI which can be passed off to an external app to send notifications to.
// The WNS Channel URI uniquely identifies this app for this user and device.
PushNotificationChannel channel{ RequestChannel() };
if (!channel)
{
std::cout << "\nThere was an error obtaining the WNS Channel URI" << std::endl;
if (remoteId == winrt::guid{ "00000000-0000-0000-0000-000000000000" })
{
std::cout << "\nThe ObjectID has not been set. Refer to the readme file accompanying this sample\nfor the instructions on how to obtain and setup an ObjectID" << std::endl;
}
}
std::cout << "\nPress 'Enter' at any time to exit App." << std::endl;
std::cin.ignore();
}
else
{
std::cout << "Push notifications are NOT supported on this device." << std::endl;
std::cout << "App implements its own custom socket here to receive messages from the cloud since Push APIs are unsupported." << std::endl;
std::cin.ignore();
}
}
break;
case ExtendedActivationKind::Push:
{
std::cout << "App activated via push notification." << std::endl;
PushNotificationReceivedEventArgs pushArgs{ args.Data().as<PushNotificationReceivedEventArgs>() };
// Call GetDeferral to ensure that code runs in low power
auto deferral{ pushArgs.GetDeferral() };
auto payload{ pushArgs.Payload() };
// Do stuff to process the raw notification payload
std::string payloadString(payload.begin(), payload.end());
std::cout << "\nPush notification content received in the BACKGROUND: " << payloadString.c_str() << std::endl;
std::cout << "\nPress 'Enter' to exit the App." << std::endl;
// Call Complete on the deferral when finished processing the payload.
// This removes the override that kept the app running even when the system was in a low power mode.
deferral.Complete();
std::cin.ignore();
}
break;
default:
std::cout << "\nUnexpected activation type" << std::endl;
std::cout << "\nPress 'Enter' to exit the App." << std::endl;
std::cin.ignore();
break;
}
}
6. lépés: Az alkalmazás létrehozása és telepítése
Az Visual Studio használatával hozhatja létre és telepítheti az alkalmazást. Kattintson a jobb gombbal a megoldásfájlra a Megoldáskezelő, és válassza a Deploy lehetőséget. Visual Studio létrehozza és telepíti az alkalmazást a gépére. Az alkalmazást a Start menüben vagy a Visual Studio hibakeresővel futtathatja.
Az oktatóanyag kódjának konzolja így fog kinézni:
Szüksége lesz a tokenre, hogy leküldéses értesítést küldjön az alkalmazásához.
Push értesítés küldése az alkalmazásba
Ezen a ponton az összes konfiguráció befejeződött, és a WNS-kiszolgáló leküldéses értesítéseket küldhet az ügyfélalkalmazásoknak. A következő lépések során, további részletekért tekintse meg a push értesítési kiszolgáló kérelem- és válaszfejléceit.
1. lépés: Hozzáférési jogkivonat kérése
Push értesítés küldéséhez a WNS-kiszolgálónak először hozzáférési tokent kell kérnie. HTTP POST-kérés küldése a Azure TenantId, Azure AppId és titkos kód használatával. A Azure TenantId és Azure AppId lekéréséről további információt a A bejelentkezéshez használt bérlői és alkalmazásazonosító-értékek című témakörben talál.
HTTP-mintakérés:
POST /{tenantID}/oauth2/v2.0/token Http/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 160
grant_type=client_credentials&client_id=<Azure_App_Registration_AppId_Here>&client_secret=<Azure_App_Registration_Secret_Here>&scope=https://wns.windows.com/.default/
C# mintakérés:
//Sample C# Access token request
var client = new RestClient("https://login.microsoftonline.com/{tenantID}/oauth2/v2.0");
var request = new RestRequest("/token", Method.Post);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("grant_type", "client_credentials");
request.AddParameter("client_id", "[Your app's Azure AppId]");
request.AddParameter("client_secret", "[Your app's secret]");
request.AddParameter("scope", "https://wns.windows.com/.default");
RestResponse response = await client.ExecutePostAsync(request);
Console.WriteLine(response.Content);
Ha a kérés sikeres, egy olyan választ kap, amely a tokent tartalmazza a access_token mezőben.
{
"token_type":"Bearer",
"expires_in":"86399",
"ext_expires_in":"86399",
"expires_on":"1653771789",
"not_before":"1653685089",
"access_token":"[your access token]"
}
2. lépés. Nyers értesítés küldése
Hozzon létre egy HTTP POST-kérést, amely tartalmazza az előző lépésben beszerzett hozzáférési jogkivonatot és a küldeni kívánt leküldéses értesítés tartalmát. A leküldéses értesítés tartalma az alkalmazáshoz lesz kézbesítve.
POST /?token=[The token query string parameter from your channel URL. E.g. AwYAAABa5cJ3...] HTTP/1.1
Host: dm3p.notify.windows.com
Content-Type: application/octet-stream
X-WNS-Type: wns/raw
Authorization: Bearer [your access token]
Content-Length: 46
{ Sync: "Hello from the Contoso App Service" }
var client = new RestClient("[Your channel URL. E.g. https://wns2-by3p.notify.windows.com/?token=AwYAAABa5cJ3...]");
var request = new RestRequest();
request.Method = Method.Post;
request.AddHeader("Content-Type", "application/octet-stream");
request.AddHeader("X-WNS-Type", "wns/raw");
request.AddHeader("Authorization", "Bearer [your access token]");
request.AddBody("Notification body");
RestResponse response = await client.ExecutePostAsync(request);");
3. lépés: Felhőalapú alkalmazásértesítés küldése
Ha csak nyers értesítéseket szeretne küldeni, hagyja figyelmen kívül ezt a lépést. Ha felhőből származó alkalmazásértesítést, más néven push értesítést szeretne küldeni, először kövesse a Quickstart: Alkalmazásértesítések a Windows App SDK útmutatót. Az alkalmazásértesítések lehetnek push értesítések (a felhőből küldött) vagy helyben küldött értesítések. A felhőalapú alkalmazásértesítések küldése hasonló a 2. lépés
Hozzon létre egy HTTP POST-kérést, amely tartalmazza a hozzáférési jogkivonatot és a küldendő felhőalapú alkalmazásértesítés tartalmát. A leküldéses értesítés tartalma az alkalmazáshoz lesz kézbesítve.
POST /?token=AwYAAAB%2fQAhYEiAESPobjHzQcwGCTjHu%2f%2fP3CCNDcyfyvgbK5xD3kztniW%2bjba1b3aSSun58SA326GMxuzZooJYwtpgzL9AusPDES2alyQ8CHvW94cO5VuxxLDVzrSzdO1ZVgm%2bNSB9BAzOASvHqkMHQhsDy HTTP/1.1
Host: dm3p.notify.windows.com
Content-Type: text/xml
X-WNS-Type: wns/toast
Authorization: Bearer [your access token]
Content-Length: 180
<toast><visual><binding template="ToastGeneric"><text>Example cloud toast notification</text><text>This is an example cloud notification using XML</text></binding></visual></toast>
var client = new RestClient("https://dm3p.notify.windows.com/?token=AwYAAAB%2fQAhYEiAESPobjHzQcwGCTjHu%2f%2fP3CCNDcyfyvgbK5xD3kztniW%2bjba1b3aSSun58SA326GMxuzZooJYwtpgzL9AusPDES2alyQ8CHvW94cO5VuxxLDVzrSzdO1ZVgm%2bNSB9BAzOASvHqkMHQhsDy");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "text/xml");
request.AddHeader("X-WNS-Type", "wns/toast");
request.AddHeader("Authorization", "Bearer <AccessToken>");
request.AddParameter("text/xml", "<toast><visual><binding template=\"ToastGeneric\"><text>Example cloud toast notification</text><text>This is an example cloud notification using XML</text></binding></visual></toast>", ParameterType.RequestBody);
Console.WriteLine(response.Content);
Resources
Windows developer