Bagikan melalui


Membuat dan menggunakan layanan aplikasi

Penting

Daftar kode dalam topik ini hanya C#. Untuk aplikasi sampel layanan aplikasi di C++/WinRT serta C#, lihat Aplikasi sampel layanan aplikasi.

Layanan aplikasi adalah aplikasi UWP yang menyediakan layanan ke aplikasi UWP lainnya. Mereka dianalogikan dengan layanan web, pada perangkat. Layanan aplikasi berjalan sebagai tugas latar belakang di aplikasi host dan dapat menyediakan layanannya ke aplikasi lain. Misalnya, layanan aplikasi mungkin menyediakan layanan pemindai kode batang yang dapat digunakan aplikasi lain. Atau mungkin rangkaian aplikasi Enterprise memiliki layanan aplikasi pemeriksaan ejaan umum yang tersedia untuk aplikasi lain di suite. Layanan aplikasi memungkinkan Anda membuat layanan tanpa antarmuka pengguna yang dapat dipanggil aplikasi di perangkat yang sama, dan dimulai dengan Windows 10, versi 1607, di perangkat jarak jauh.

Mulai dari Windows 10, versi 1607, Anda dapat membuat layanan aplikasi yang berjalan dalam proses yang sama dengan aplikasi host. Artikel ini berfokus pada pembuatan dan penggunaan layanan aplikasi yang berjalan dalam proses latar belakang terpisah. Lihat Mengonversi layanan aplikasi untuk dijalankan dalam proses yang sama dengan aplikasi hostnya untuk detail selengkapnya tentang menjalankan layanan aplikasi dalam proses yang sama dengan penyedia.

Membuat proyek penyedia layanan aplikasi baru

Dalam cara ini, kita akan membuat semuanya dalam satu solusi untuk kesederhanaan.

  1. Di Visual Studio 2015 atau yang lebih baru, buat proyek aplikasi UWP baru dan beri nama AppServiceProvider.

    1. Pilih File > Proyek Baru > ...
    2. Dalam kotak dialog Buat proyek baru, pilih Aplikasi Kosong (Universal Windows) C#. Ini akan menjadi aplikasi yang membuat layanan aplikasi tersedia untuk aplikasi UWP lainnya.
    3. Klik Berikutnya, lalu beri nama proyek AppServiceProvider, pilih lokasi untuk proyek tersebut, lalu klik Buat.
  2. Saat diminta untuk memilih versi Target dan Minimum untuk proyek, pilih setidaknya 10.0.14393. Jika Anda ingin menggunakan atribut SupportsMultipleInstances baru, Anda harus menggunakan Visual Studio 2017 atau Visual Studio 2019, dan target 10.0.15063 (Windows 10 Creators Update) atau yang lebih baru.

Menambahkan ekstensi layanan aplikasi ke Package.appxmanifest

Dalam proyek AppServiceProvider, buka file Package.appxmanifest di editor teks:

  1. Klik kanan di Penjelajah Solusi.
  2. Pilih Buka Dengan.
  3. Pilih Editor XML (Teks).

Tambahkan ekstensi berikut AppService di <Application> dalam elemen . Contoh ini mengiklankan com.microsoft.inventory layanan dan apa yang mengidentifikasi aplikasi ini sebagai penyedia layanan aplikasi. Layanan aktual akan diimplementasikan sebagai tugas latar belakang. Proyek layanan aplikasi mengekspos layanan ke aplikasi lain. Sebaiknya gunakan gaya nama domain terbalik untuk nama layanan.

Perhatikan bahwa awalan xmlns:uap4 namespace dan uap4:SupportsMultipleInstances atribut hanya valid jika Anda menargetkan Windows SDK versi 10.0.15063 atau yang lebih baru. Anda dapat menghapusnya dengan aman jika Anda menargetkan versi SDK yang lebih lama.

Catatan

Untuk aplikasi sampel layanan aplikasi di C++/WinRT serta C#, lihat Aplikasi sampel layanan aplikasi.

<Package
    ...
    xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
    xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
    ...
    <Applications>
        <Application Id="AppServiceProvider.App"
          Executable="$targetnametoken$.exe"
          EntryPoint="AppServiceProvider.App">
          ...
          <Extensions>
            <uap:Extension Category="windows.appService" EntryPoint="MyAppService.Inventory">
              <uap3:AppService Name="com.microsoft.inventory" uap4:SupportsMultipleInstances="true"/>
            </uap:Extension>
          </Extensions>
          ...
        </Application>
    </Applications>

Atribut Category mengidentifikasi aplikasi ini sebagai penyedia layanan aplikasi.

Atribut EntryPoint mengidentifikasi kelas namespace yang memenuhi syarat yang mengimplementasikan layanan, yang akan kami terapkan berikutnya.

Atribut SupportsMultipleInstances menunjukkan bahwa setiap kali layanan aplikasi disebut bahwa itu harus berjalan dalam proses baru. Ini tidak diperlukan tetapi tersedia untuk Anda jika Anda memerlukan fungsionalitas tersebut dan menargetkan SDK 10.0.15063 (Pembaruan Pembuat Windows 10) atau yang lebih baru. Ini juga harus diawali oleh uap4 namespace layanan.

Membuat layanan aplikasi

  1. Layanan aplikasi dapat diimplementasikan sebagai tugas latar belakang. Ini memungkinkan aplikasi latar depan untuk memanggil layanan aplikasi di aplikasi lain. Untuk membuat layanan aplikasi sebagai tugas latar belakang, tambahkan proyek komponen Windows Runtime baru ke solusi (File > Tambahkan > Proyek Baru) bernama MyAppService. Dalam kotak dialog Tambahkan Proyek Baru, pilih Komponen Runtime Visual C# > Windows Terinstal > (Universal Windows).

  2. Dalam proyek AppServiceProvider, tambahkan referensi proyek ke proyek ke proyek MyAppService baru (di Penjelajah Solusi, klik kanan pada proyek >AppServiceProvider Tambahkan>Solusi Proyek>Referensi>, pilih MyAppService>OK). Langkah ini sangat penting karena jika Anda tidak menambahkan referensi, layanan aplikasi tidak akan terhubung saat runtime.

  3. Dalam proyek MyAppService, tambahkan pernyataan penggunaan berikut ke bagian atas Class1.cs:

    using Windows.ApplicationModel.AppService;
    using Windows.ApplicationModel.Background;
    using Windows.Foundation.Collections;
    
  4. Ganti nama Class1.cs menjadi Inventory.cs, dan ganti kode stub untuk Class1 dengan kelas tugas latar belakang baru bernama Inventory:

    public sealed class Inventory : IBackgroundTask
    {
        private BackgroundTaskDeferral backgroundTaskDeferral;
        private AppServiceConnection appServiceconnection;
        private String[] inventoryItems = new string[] { "Robot vacuum", "Chair" };
        private double[] inventoryPrices = new double[] { 129.99, 88.99 };
    
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Get a deferral so that the service isn't terminated.
            this.backgroundTaskDeferral = taskInstance.GetDeferral();
    
            // Associate a cancellation handler with the background task.
            taskInstance.Canceled += OnTaskCanceled;
    
            // Retrieve the app service connection and set up a listener for incoming app service requests.
            var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
            appServiceconnection = details.AppServiceConnection;
            appServiceconnection.RequestReceived += OnRequestReceived;
        }
    
        private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
        {
            // This function is called when the app service receives a request.
        }
    
        private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            if (this.backgroundTaskDeferral != null)
            {
                // Complete the service deferral.
                this.backgroundTaskDeferral.Complete();
            }
        }
    }
    

    Kelas ini adalah tempat layanan aplikasi akan melakukan pekerjaannya.

    Jalankan dipanggil ketika tugas latar belakang dibuat. Karena tugas latar belakang dihentikan setelah Eksekusi selesai, kode mengeluarkan penahanan sehingga tugas latar belakang akan tetap terjaga untuk melayani permintaan. Layanan aplikasi yang diimplementasikan sebagai tugas latar belakang akan tetap hidup selama sekitar 30 detik setelah menerima panggilan kecuali dipanggil lagi dalam jendela waktu tersebut atau penahanan diambil. Jika layanan aplikasi diimplementasikan dalam proses yang sama dengan pemanggil, masa pakai layanan aplikasi terkait dengan masa pakai pemanggil.

    Masa pakai layanan aplikasi tergantung pada pemanggil:

    • Jika penelepon berada di latar depan, masa pakai layanan aplikasi sama dengan pemanggil.
    • Jika pemanggil berada di latar belakang, layanan aplikasi akan berjalan 30 detik. Mengeluarkan deferral menyediakan tambahan satu kali 5 detik.

    OnTaskCanceled dipanggil ketika tugas dibatalkan. Tugas dibatalkan ketika aplikasi klien membuang AppServiceConnection, aplikasi klien ditangguhkan, OS dimatikan atau tidur, atau OS kehabisan sumber daya untuk menjalankan tugas.

Menulis kode untuk layanan aplikasi

OnRequestReceived adalah tempat kode untuk layanan aplikasi pergi. Ganti stub OnRequestReceived di Inventory.cs MyAppService dengan kode dari contoh ini. Kode ini mendapatkan indeks untuk item inventori dan meneruskannya, bersama dengan string perintah, ke layanan untuk mengambil nama dan harga item inventori yang ditentukan. Untuk proyek Anda sendiri, tambahkan kode penanganan kesalahan.

private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    // Get a deferral because we use an awaitable API below to respond to the message
    // and we don't want this call to get canceled while we are waiting.
    var messageDeferral = args.GetDeferral();

    ValueSet message = args.Request.Message;
    ValueSet returnData = new ValueSet();

    string command = message["Command"] as string;
    int? inventoryIndex = message["ID"] as int?;

    if (inventoryIndex.HasValue &&
        inventoryIndex.Value >= 0 &&
        inventoryIndex.Value < inventoryItems.GetLength(0))
    {
        switch (command)
        {
            case "Price":
            {
                returnData.Add("Result", inventoryPrices[inventoryIndex.Value]);
                returnData.Add("Status", "OK");
                break;
            }

            case "Item":
            {
                returnData.Add("Result", inventoryItems[inventoryIndex.Value]);
                returnData.Add("Status", "OK");
                break;
            }

            default:
            {
                returnData.Add("Status", "Fail: unknown command");
                break;
            }
        }
    }
    else
    {
        returnData.Add("Status", "Fail: Index out of range");
    }

    try
    {
        // Return the data to the caller.
        await args.Request.SendResponseAsync(returnData);
    }
    catch (Exception e)
    {
        // Your exception handling code here.
    }
    finally
    {
        // Complete the deferral so that the platform knows that we're done responding to the app service call.
        // Note for error handling: this must be called even if SendResponseAsync() throws an exception.
        messageDeferral.Complete();
    }
}

Perhatikan bahwa OnRequestReceived adalah asinkron karena kami melakukan panggilan metode yang dapat ditunggu ke SendResponseAsync dalam contoh ini.

Penundaan diambil sehingga layanan dapat menggunakan metode asinkron di handler OnRequestReceived . Ini memastikan bahwa panggilan ke OnRequestReceived tidak selesai sampai selesai memproses pesan. SendResponseAsync mengirimkan hasilnya ke pemanggil. SendResponseAsync tidak menandakan penyelesaian panggilan. Ini adalah penyelesaian penundaan yang memberi sinyal ke SendMessageAsync bahwa OnRequestReceived telah selesai. Panggilan ke SendResponseAsync dibungkus dalam blok coba/akhirnya karena Anda harus menyelesaikan penundaan meskipun SendResponseAsync melempar pengecualian.

Layanan aplikasi menggunakan objek ValueSet untuk bertukar informasi. Ukuran data yang mungkin Anda lewati hanya dibatasi oleh sumber daya sistem. Tidak ada kunci yang telah ditentukan sebelumnya untuk Anda gunakan di ValueSet Anda. Anda harus menentukan nilai kunci mana yang akan Anda gunakan untuk menentukan protokol untuk layanan aplikasi Anda. Pemanggil harus ditulis dengan mengingat protokol itu. Dalam contoh ini, kami telah memilih kunci bernama Command yang memiliki nilai yang menunjukkan apakah kami ingin layanan aplikasi memberikan nama item inventori atau harganya. Indeks nama inventori disimpan di bawah ID kunci. Nilai yang dikembalikan disimpan di Result bawah kunci.

Enum AppServiceClosedStatus dikembalikan ke pemanggil untuk menunjukkan apakah panggilan ke layanan aplikasi berhasil atau gagal. Contoh bagaimana panggilan ke layanan aplikasi dapat gagal adalah jika OS membatalkan titik akhir layanan karena sumber dayanya telah terlampaui. Anda dapat mengembalikan informasi kesalahan tambahan melalui ValueSet. Dalam contoh ini, kami menggunakan kunci bernama Status untuk mengembalikan informasi kesalahan yang lebih rinci ke pemanggil.

Panggilan ke SendResponseAsync mengembalikan ValueSet ke pemanggil.

Menyebarkan aplikasi layanan dan mendapatkan nama keluarga paket

Penyedia layanan aplikasi harus disebarkan sebelum Anda dapat memanggilnya dari klien. Anda dapat menyebarkannya dengan memilih Build > Deploy Solution di Visual Studio.

Anda juga akan memerlukan nama keluarga paket penyedia layanan aplikasi untuk memanggilnya. Anda bisa mendapatkannya dengan membuka file Package.appxmanifest proyek AppServiceProvider dalam tampilan perancang (klik dua kali di Penjelajah Solusi). Pilih tab Kemasan , salin nilai di samping Nama keluarga paket, dan tempelkan di suatu tempat seperti Notepad untuk saat ini.

Menulis klien untuk memanggil layanan aplikasi

  1. Tambahkan proyek aplikasi Windows Universal kosong baru ke solusi dengan File > Tambahkan > Proyek Baru. Dalam kotak dialog Tambahkan Proyek Baru, pilih Aplikasi Kosong Visual C# > Terinstal > (Windows Universal) dan beri nama ClientApp.

  2. Dalam proyek ClientApp, tambahkan pernyataan penggunaan berikut ke bagian atas MainPage.xaml.cs:

    using Windows.ApplicationModel.AppService;
    
  3. Tambahkan kotak teks yang disebut textBox dan tombol ke MainPage.xaml.

  4. Tambahkan handler klik tombol untuk tombol yang disebut button_Click, dan tambahkan asinkron kata kunci ke tanda tangan handler tombol.

  5. Ganti stub handler klik tombol Anda dengan kode berikut. Pastikan untuk menyertakan inventoryService deklarasi bidang.

    private AppServiceConnection inventoryService;
    
    private async void button_Click(object sender, RoutedEventArgs e)
    {
       // Add the connection.
       if (this.inventoryService == null)
       {
           this.inventoryService = new AppServiceConnection();
    
           // Here, we use the app service name defined in the app service 
           // provider's Package.appxmanifest file in the <Extension> section.
           this.inventoryService.AppServiceName = "com.microsoft.inventory";
    
           // Use Windows.ApplicationModel.Package.Current.Id.FamilyName 
           // within the app service provider to get this value.
           this.inventoryService.PackageFamilyName = "Replace with the package family name";
    
           var status = await this.inventoryService.OpenAsync();
    
           if (status != AppServiceConnectionStatus.Success)
           {
               textBox.Text= "Failed to connect";
               this.inventoryService = null;
               return;
           }
       }
    
       // Call the service.
       int idx = int.Parse(textBox.Text);
       var message = new ValueSet();
       message.Add("Command", "Item");
       message.Add("ID", idx);
       AppServiceResponse response = await this.inventoryService.SendMessageAsync(message);
       string result = "";
    
       if (response.Status == AppServiceResponseStatus.Success)
       {
           // Get the data  that the service sent to us.
           if (response.Message["Status"] as string == "OK")
           {
               result = response.Message["Result"] as string;
           }
       }
    
       message.Clear();
       message.Add("Command", "Price");
       message.Add("ID", idx);
       response = await this.inventoryService.SendMessageAsync(message);
    
       if (response.Status == AppServiceResponseStatus.Success)
       {
           // Get the data that the service sent to us.
           if (response.Message["Status"] as string == "OK")
           {
               result += " : Price = " + response.Message["Result"] as string;
           }
       }
    
       textBox.Text = result;
    }
    

    Ganti nama keluarga paket sejalan this.inventoryService.PackageFamilyName = "Replace with the package family name"; dengan nama keluarga paket proyek AppServiceProvider yang Anda peroleh di atas di Sebarkan aplikasi layanan dan dapatkan nama keluarga paket.

    Catatan

    Pastikan untuk menempelkan string secara harfiah, daripada memasukkannya ke dalam variabel. Ini tidak akan berfungsi jika Anda menggunakan variabel.

    Kode pertama-tama membuat koneksi dengan layanan aplikasi. Koneksi akan tetap terbuka sampai Anda membuang this.inventoryService. Nama layanan aplikasi harus cocok dengan AppService atribut elemen Name yang Anda tambahkan ke file Package.appxmanifest proyek AppServiceProvider. Pada contoh ini adalah <uap3:AppService Name="com.microsoft.inventory"/>.

    ValueSet bernama message dibuat untuk menentukan perintah yang ingin kita kirim ke layanan aplikasi. Contoh layanan aplikasi mengharapkan perintah untuk menunjukkan mana dari dua tindakan yang akan diambil. Kami mendapatkan indeks dari kotak teks di aplikasi klien, lalu memanggil layanan dengan Item perintah untuk mendapatkan deskripsi item. Kemudian, kita melakukan panggilan dengan Price perintah untuk mendapatkan harga item. Teks tombol diatur ke hasil.

    Karena AppServiceResponseStatus hanya menunjukkan apakah sistem operasi dapat menghubungkan panggilan ke layanan aplikasi, kami memeriksa Status kunci di ValueSet yang kami terima dari layanan aplikasi untuk memastikan bahwa sistem operasi dapat memenuhi permintaan.

  6. Atur proyek ClientApp menjadi proyek startup (klik kanan di Penjelajah Solusi> Set sebagai Proyek StartUp) dan jalankan solusi. Masukkan angka 1 ke dalam kotak teks dan klik tombol . Anda harus mendapatkan "Kursi : Harga = 88,99" kembali dari layanan.

    aplikasi sampel yang menampilkan harga kursi=88,99

Jika panggilan layanan aplikasi gagal, periksa hal berikut di proyek ClientApp :

  1. Verifikasi bahwa nama keluarga paket yang ditetapkan ke koneksi layanan inventori cocok dengan nama keluarga paket aplikasi AppServiceProvider . Lihat baris di button_Click dengan this.inventoryService.PackageFamilyName = "...";.
  2. Dalam button_Click, verifikasi bahwa nama layanan aplikasi yang ditetapkan ke koneksi layanan inventori cocok dengan nama layanan aplikasi dalam file Package.appxmanifest AppServiceProvider. Lihat: this.inventoryService.AppServiceName = "com.microsoft.inventory";.
  3. Pastikan bahwa aplikasi AppServiceProvider telah disebarkan. (Dalam Penjelajah Solusi, klik kanan solusi dan pilih Sebarkan Solusi).

Men-debug layanan aplikasi

  1. Pastikan bahwa solusi disebarkan sebelum penelusuran kesalahan karena aplikasi penyedia layanan aplikasi harus disebarkan sebelum layanan dapat dipanggil. (Di Visual Studio, Bangun > Solusi Penyebaran).
  2. Di Penjelajah Solusi, klik kanan proyek AppServiceProvider dan pilih Properti. Dari tab Debug , ubah tindakan Mulai menjadi Jangan luncurkan, tetapi debug kode saya saat dimulai. (Catatan, jika Anda menggunakan C++ untuk mengimplementasikan penyedia layanan aplikasi Anda, dari Tab Penelusuran kesalahan , Anda akan mengubah Luncurkan Aplikasi menjadi Tidak).
  3. Dalam proyek MyAppService, dalam file Inventory.cs, atur titik henti di OnRequestReceived.
  4. Atur proyek AppServiceProvider menjadi proyek startup dan tekan F5.
  5. Mulai ClientApp dari menu Mulai (bukan dari Visual Studio).
  6. Masukkan angka 1 ke dalam kotak teks dan tekan tombol . Debugger akan berhenti dalam panggilan layanan aplikasi pada titik henti di layanan aplikasi Anda.

Men-debug klien

  1. Ikuti instruksi di langkah sebelumnya untuk men-debug klien yang memanggil layanan aplikasi.
  2. Luncurkan ClientApp dari menu Mulai.
  3. Lampirkan debugger ke proses ClientApp.exe (bukan proses ApplicationFrameHost.exe ). (Di Visual Studio, pilih Lampirkan Debug > ke Proses....)
  4. Dalam proyek ClientApp, atur titik henti di button_Click.
  5. Titik henti di klien dan layanan aplikasi sekarang akan dipukul ketika Anda memasukkan nomor 1 ke dalam kotak teks ClientApp dan klik tombol .

Pemecahan masalah layanan aplikasi umum

Jika Anda menemukan status AppUnavailable setelah mencoba menyambungkan ke layanan aplikasi, periksa hal berikut:

  • Pastikan bahwa proyek penyedia layanan aplikasi dan proyek layanan aplikasi disebarkan. Keduanya perlu disebarkan sebelum menjalankan klien karena jika tidak, klien tidak akan memiliki apa pun untuk disambungkan. Anda dapat menyebarkan dari Visual Studio dengan menggunakan Build>Deploy Solution.
  • Dalam Penjelajah Solusi, pastikan bahwa proyek penyedia layanan aplikasi Anda memiliki referensi proyek-ke-proyek ke proyek yang mengimplementasikan layanan aplikasi.
  • Verifikasi bahwa <Extensions> entri, dan elemen turunannya, telah ditambahkan ke file Package.appxmanifest milik proyek penyedia layanan aplikasi seperti yang ditentukan di atas dalam Menambahkan ekstensi layanan aplikasi ke Package.appxmanifest.
  • Pastikan bahwa string AppServiceConnection.AppServiceName di klien Anda yang memanggil penyedia layanan aplikasi cocok <uap3:AppService Name="..." /> dengan yang ditentukan dalam file Package.appxmanifest proyek penyedia layanan aplikasi.
  • Pastikan bahwa AppServiceConnection.PackageFamilyName cocok dengan nama keluarga paket komponen penyedia layanan aplikasi seperti yang ditentukan di atas di Menambahkan ekstensi layanan aplikasi ke Package.appxmanifest
  • Untuk layanan aplikasi out-of-proc seperti yang ada dalam contoh ini, validasi bahwa yang EntryPoint ditentukan dalam <uap:Extension ...> elemen file Package.appxmanifest proyek penyedia layanan aplikasi Anda cocok dengan namespace layanan dan nama kelas kelas kelas publik yang mengimplementasikan IBackgroundTask dalam proyek layanan aplikasi Anda.

Memecahkan masalah penelusuran kesalahan

Jika debugger tidak berhenti pada titik henti di penyedia layanan aplikasi atau proyek layanan aplikasi Anda, periksa hal berikut:

  • Pastikan bahwa proyek penyedia layanan aplikasi dan proyek layanan aplikasi disebarkan. Keduanya perlu disebarkan sebelum menjalankan klien. Anda dapat menyebarkannya dari Visual Studio dengan menggunakan Build>Deploy Solution.
  • Pastikan bahwa proyek yang ingin Anda debug ditetapkan sebagai proyek startup dan bahwa properti debugging untuk proyek tersebut diatur untuk tidak menjalankan proyek saat F5 ditekan. Klik kanan proyek, lalu klik Properti, lalu Debug (atau Debugging di C++). Di C#, ubah tindakan Mulai menjadi Jangan luncurkan, tetapi debug kode saya saat dimulai. Di C++, atur Luncurkan Aplikasi ke Tidak.

Keterangan

Contoh ini menyediakan pengenalan untuk membuat layanan aplikasi yang berjalan sebagai tugas latar belakang dan memanggilnya dari aplikasi lain. Hal-hal utama yang perlu diperhatikan adalah:

  • Buat tugas latar belakang untuk menghosting layanan aplikasi.
  • windows.appService Tambahkan ekstensi ke file Package.appxmanifest penyedia layanan aplikasi.
  • Dapatkan nama keluarga paket penyedia layanan aplikasi sehingga kami dapat terhubung ke paket tersebut dari aplikasi klien.
  • Tambahkan referensi proyek-ke-proyek dari proyek penyedia layanan aplikasi ke proyek layanan aplikasi.
  • Gunakan Windows.ApplicationModel.AppService.AppServiceConnection untuk memanggil layanan.

Kode lengkap untuk MyAppService

using System;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.Foundation.Collections;

namespace MyAppService
{
    public sealed class Inventory : IBackgroundTask
    {
        private BackgroundTaskDeferral backgroundTaskDeferral;
        private AppServiceConnection appServiceconnection;
        private String[] inventoryItems = new string[] { "Robot vacuum", "Chair" };
        private double[] inventoryPrices = new double[] { 129.99, 88.99 };

        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Get a deferral so that the service isn't terminated.
            this.backgroundTaskDeferral = taskInstance.GetDeferral();

            // Associate a cancellation handler with the background task.
            taskInstance.Canceled += OnTaskCanceled;

            // Retrieve the app service connection and set up a listener for incoming app service requests.
            var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
            appServiceconnection = details.AppServiceConnection;
            appServiceconnection.RequestReceived += OnRequestReceived;
        }

        private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
        {
            // Get a deferral because we use an awaitable API below to respond to the message
            // and we don't want this call to get canceled while we are waiting.
            var messageDeferral = args.GetDeferral();

            ValueSet message = args.Request.Message;
            ValueSet returnData = new ValueSet();

            string command = message["Command"] as string;
            int? inventoryIndex = message["ID"] as int?;

            if (inventoryIndex.HasValue &&
                 inventoryIndex.Value >= 0 &&
                 inventoryIndex.Value < inventoryItems.GetLength(0))
            {
                switch (command)
                {
                    case "Price":
                        {
                            returnData.Add("Result", inventoryPrices[inventoryIndex.Value]);
                            returnData.Add("Status", "OK");
                            break;
                        }

                    case "Item":
                        {
                            returnData.Add("Result", inventoryItems[inventoryIndex.Value]);
                            returnData.Add("Status", "OK");
                            break;
                        }

                    default:
                        {
                            returnData.Add("Status", "Fail: unknown command");
                            break;
                        }
                }
            }
            else
            {
                returnData.Add("Status", "Fail: Index out of range");
            }

            // Return the data to the caller.
            await args.Request.SendResponseAsync(returnData);

            // Complete the deferral so that the platform knows that we're done responding to the app service call.
            // Note for error handling: this must be called even if SendResponseAsync() throws an exception.
            messageDeferral.Complete();
        }


        private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            if (this.backgroundTaskDeferral != null)
            {
                // Complete the service deferral.
                this.backgroundTaskDeferral.Complete();
            }
        }
    }
}