Ağ temelleri

Ağ özellikli herhangi bir uygulama için yapmanız gerekenler.

Capabilities

Ağ iletişimi kullanmak için uygulama bildiriminize uygun yetenek öğeleri eklemeniz gerekir. Uygulamanızın bildiriminde herhangi bir ağ özelliği belirtilmezse, uygulamanızın ağ özelliği olmaz ve ağa bağlanma girişimi başarısız olur.

En çok kullanılan ağ özellikleri aşağıdadır.

Yetenek Description
internetClient İnternet'e ve havaalanları ve kafe gibi halka açık yerlerdeki ağlara giden erişim sağlar. İnternet erişimi gerektiren uygulamaların çoğu bu özelliği kullanmalıdır.
internetClientServer Uygulamaya İnternet'ten gelen ve giden ağ erişimi verir ve havalimanları ve kafe gibi halka açık yerlerdeki ağlara erişim verir.
privateNetworkClientServer Uygulamaya ev ve iş gibi kullanıcının güvenilen yerlerinde gelen ve giden ağ erişimi verir.

Belirli durumlarda uygulamanız için gerekli olabilecek başka özellikler de vardır.

Yetenek Description
enterpriseAuthentication Bir uygulamanın etki alanı kimlik bilgileri gerektiren ağ kaynaklarına bağlanmasına izin verir. Örneğin, özel intranetteki SharePoint sunuculardan veri alan bir uygulama. Bu özellik sayesinde kimlik bilgileriniz, kimlik bilgileri gerektiren bir ağdaki ağ kaynaklarına erişmek için kullanılabilir. Bu özelliğe sahip bir uygulama ağdaki kimliğinize bürünebilir. Uygulamanızın kimlik doğrulama ara sunucusu aracılığıyla İnternet'e erişmesine izin vermek için bu özelliğe ihtiyacınız yoktur.

Daha fazla ayrıntı için Kısıtlı özellikler'dekiKurumsal yetenek senaryosu belgelerine bakın.
Yakınlık Bilgisayara yakın olan cihazlarla yakın alan yakınlığı iletişimi için gereklidir. Yakın alan yakınlığı, yakındaki bir cihazdaki bir uygulamayı göndermek veya bu uygulamayla bağlantı kurmak için kullanılabilir.

Bu özellik, bir uygulamanın bir cihaza yakın bir şekilde bağlanmak için ağa erişmesine ve kullanıcının davet göndermesine veya davet kabul etmesine izin vermesine olanak tanır.
sharedUserCertificates Bu özellik, bir uygulamanın akıllı kart sertifikaları gibi yazılım ve donanım sertifikalarına erişmesine olanak tanır. Bu özellik çalışma zamanında çağrıldığında, kullanıcının kart ekleme veya sertifika seçme gibi eylemler gerçekleştirmesi gerekir.

Bu özellik sayesinde yazılım ve donanım sertifikalarınız veya akıllı kartınız uygulamada tanımlama için kullanılır. Bu özellik, işvereniniz, bankanız veya kamu hizmetleri tarafından kimlik tespiti için kullanılabilir.

Uygulamanız ön planda olmadığında iletişim kurma

Arka plan görevleri , uygulamanız ön planda olmadığında iş yapma hakkında genel bilgiler sağlar. Daha açık söylemek gerekirse, kodunuzun, o anda ön plandaki uygulama olmadığında ve kendisine ağ üzerinden veri ulaştığında bundan haberdar olabilmesi için özel adımlar atması gerekir. Denetim Kanalı Tetikleyicileri, Windows'ta bu amaçla desteklenir. Ayrıntılar için bkz. ControlChannelTrigger. Daha yeni bir teknoloji, anında iletim özellikli akış soketleri gibi bazı senaryolarda daha düşük ek yükle daha iyi işlevsellik sunar: soket aracısı ve soket etkinliği tetikleyicileri.

Uygulamanız DatagramSocket, StreamSocket veya StreamSocketListener kullanıyorsa, uygulamanız açık bir yuvanın sahipliğini sistem tarafından sağlanan bir yuva aracısına aktarabilir ve ardından ön planı terk edebilir, hatta sonlandırabilir. Aktarılan yuvada bir bağlantı yapıldığında veya trafik bu yuvaya ulaştığında, uygulamanız veya belirlenen arka plan görevi etkinleştirilir. Uygulamanız çalışmıyorsa başlatılır. Ardından yuva aracısı, yeni trafiğin geldiğini SocketActivityTrigger kullanarak uygulamanıza bildirir. Uygulamanız soket aracısından soketi geri alır ve soket üzerindeki trafiği işler. Bu, uygulamanızın ağ trafiğini etkin olarak işlemediğinde çok daha az sistem kaynağı tükettiği anlamına gelir.

Soket aracısı, uygulanabildiği durumlarda Control Channel Triggers'ın yerini alması için tasarlanmıştır; çünkü aynı işlevselliği daha az kısıtlama ve daha düşük bellek kullanımıyla sağlar. Socket Broker, kilit ekranı uygulaması olmayan uygulamalar tarafından kullanılabilir ve telefonlarda da diğer cihazlarla aynı şekilde kullanılır. Soket aracısı tarafından etkinleştirilmeleri için uygulamaların trafik geldiğinde çalışıyor olmaları gerekmez. Ayrıca yuva aracısı, Denetim Kanalı Tetikleyicilerinin desteklemediği TCP yuvalarında dinlemeyi destekler.

Ağ tetikleyicisi seçme

Her iki tür tetikleyicinin de uygun olacağı bazı senaryolar vardır. Uygulamanızda kullanılacak tetikleyici türünü seçerken aşağıdaki önerileri göz önünde bulundurun.

Soket aracısının nasıl kullanılacağına dair ayrıntılar ve örnekler için bkz. Arka planda ağ iletişimleri.

Güvenli bağlantılar

Güvenli Yuva Katmanı (SSL) ve daha yeni Aktarım Katmanı Güvenliği (TLS), ağ iletişimi için kimlik doğrulaması ve şifreleme sağlamak üzere tasarlanmış şifreleme protokolleridir. Bu protokoller, ağ verilerini gönderirken ve alırken gizlice dinlemeyi ve kurcalama işlemini önlemek için tasarlanmıştır. Bu protokoller, protokol değişimleri için bir istemci-sunucu modeli kullanır. Bu protokoller, sunucunun iddia edilen kişi olduğunu doğrulamak için dijital sertifikalar ve sertifika yetkilileri de kullanır.

Güvenli yuva bağlantıları oluşturma

StreamSocket nesnesi, istemci ile sunucu arasındaki iletişimler için SSL/TLS kullanacak şekilde yapılandırılabilir. SSL/TLS için bu destek, STREAMSocket nesnesini SSL/TLS anlaşmasında istemci olarak kullanmakla sınırlıdır. Gelen iletişimler alındığında StreamSocketListener tarafından oluşturulan StreamSocket ile SSL/TLS kullanamazsınız, çünkü sunucu olarak SSL/TLS anlaşması StreamSocket sınıfı tarafından uygulanmaz.

SSL/ TLS ile StreamSocket bağlantısının güvenliğini sağlamanın iki yolu vardır:

  • ConnectAsync - Bir ağ hizmetine ilk bağlantıyı yapın ve tüm iletişimler için SSL/TLS kullanmak üzere hemen anlaşma yapın.
  • UpgradeToSslAsync - Başlangıçta şifreleme olmadan bir ağ hizmetine bağlanın. Uygulama veri gönderebilir veya alabilir. Ardından, bağlantıyı tüm diğer iletişimler için SSL/TLS kullanacak şekilde yükseltin.

SocketProtectionLevel, uygulamanın bağlantıyı kurmak veya yükseltmek istediği yuva koruma düzeyini belirtir. Ancak, kurulan bağlantının nihai koruma düzeyi, bağlantının her iki uç noktası arasındaki bir anlaşma işleminde belirlenir. Sonuç, diğer uç nokta daha düşük bir düzey isterse belirttiğinizden daha düşük bir koruma düzeyi olabilir.

Zaman uyumsuz işlem başarıyla tamamlandıktan sonra, ConnectAsync veya UpgradeToSslAsync çağrısında kullanılan istenen koruma düzeyini StreamSocketInformation.ProtectionLevel özelliği aracılığıyla alabilirsiniz. Ancak bu, bağlantının kullandığı gerçek koruma düzeyini yansıtmaz.

Note

Kodunuz örtük olarak belirli bir koruma düzeyinin kullanılmasına veya belirli bir güvenlik düzeyinin varsayılan olarak kullanıldığı varsayımlarına bağlı olmamalıdır. Güvenlik ortamı sürekli değişir ve bilinen zayıflıkları olan protokollerin kullanılmasını önlemek için protokoller ve varsayılan koruma düzeyleri zaman içinde değişir. Varsayılanlar, tek tek makine yapılandırmasına veya hangi yazılımın yüklendiğine ve hangi düzeltme eklerinin uygulandığına bağlı olarak farklılık gösterebilir. Uygulamanız belirli bir güvenlik düzeyinin kullanımına bağlıysa, bu düzeyi açıkça belirtmeniz ve ardından kurulan bağlantıda gerçekten kullanımda olduğundan emin olmanız gerekir.

ConnectAsync kullanma

ConnectAsync , bir ağ hizmetiyle ilk bağlantıyı kurmak ve ardından tüm iletişimler için SSL/TLS kullanmak üzere hemen anlaşmak için kullanılabilir. protectionLevel parametresi geçirmeyi destekleyen iki ConnectAsync yöntemi vardır:

Yukarıdaki ConnectAsync yöntemlerinden biri çağrılırken protectionLevel parametresi Windows.Networking.Sockets.SocketProtectionLevel.Ssl olarak ayarlanırsa, StreamSocket şifreleme için SSL/TLS kullanacak şekilde oluşturulur. Bu değer şifreleme gerektirir ve null şifrelemenin kullanılmasına hiçbir zaman izin vermez.

Bu ConnectAsync yöntemlerinden biriyle kullanılacak normal dizi aynıdır.

Aşağıdaki örnek bir StreamSocket oluşturur ve ağ hizmetine bağlantı kurmaya çalışır ve SSL/TLS kullanmak için hemen anlaşma yapar. Anlaşma başarılı olursa, istemci arasındaki StreamSocket kullanan tüm ağ iletişimi ağ sunucusu şifrelenir.

using Windows.Networking;
using Windows.Networking.Sockets;

    // Define some variables and set values
    StreamSocket clientSocket = new StreamSocket();
     
    HostName serverHost = new HostName("www.contoso.com");
    string serverServiceName = "https";
    
    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages 
    
    // Try to connect to contoso using HTTPS (port 443)
    try {

        // Call ConnectAsync method with SSL
        await clientSocket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.Ssl);

        NotifyUser("Connected");
    }
    catch (Exception exception) {
        // If this is an unknown status it means that the error is fatal and retry will likely fail.
        if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {
            throw;
        }
        
        NotifyUser("Connect failed with error: " + exception.Message);
        // Could retry the connection, but for this simple example
        // just close the socket.
        
        clientSocket.Dispose();
        clientSocket = null; 
    }
           
    // Add code to send and receive data using the clientSocket
    // and then close the clientSocket
#include <winrt/Windows.Networking.Sockets.h>

using namespace winrt;
...
    // Define some variables, and set values.
    Windows::Networking::Sockets::StreamSocket clientSocket;

    Windows::Networking::HostName serverHost{ L"www.contoso.com" };
    winrt::hstring serverServiceName{ L"https" };

    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages.

    // Try to connect to the server using HTTPS and SSL (port 443).
    try
    {
        co_await clientSocket.ConnectAsync(serverHost, serverServiceName, Windows::Networking::Sockets::SocketProtectionLevel::Tls12);
        NotifyUser(L"Connected");
    }
    catch (winrt::hresult_error const& exception)
    {
        NotifyUser(L"Connect failed with error: " + exception.message());
        clientSocket = nullptr;
    }
    // Add code to send and receive data using the clientSocket,
    // then set the clientSocket to nullptr when done to close it.
using Windows::Networking;
using Windows::Networking::Sockets;

    // Define some variables and set values
    StreamSocket^ clientSocket = ref new StreamSocket();
 
    HostName^ serverHost = ref new HostName("www.contoso.com");
    String^ serverServiceName = "https";

    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages 

    // Try to connect to the server using HTTPS and SSL (port 443)
    task<void>(clientSocket->ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel::Ssl)).then([this] (task<void> previousTask) {
        try
        {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.Get();
            NotifyUser("Connected");
        }
        catch (Exception^ exception)
        {
            NotifyUser("Connect failed with error: " + exception->Message);
            
            clientSocket->Close();
            clientSocket = null;
        }
    });
    // Add code to send and receive data using the clientSocket
    // Then close the clientSocket when done

UpgradeToSslAsync kullanın

Kodunuz UpgradeToSslAsync kullandığında, önce şifreleme olmadan bir ağ hizmetine bağlantı kurar. Uygulama bazı veriler gönderebilir veya alabilir, ardından bağlantıyı tüm diğer iletişimler için SSL/TLS kullanacak şekilde yükseltebilir.

UpgradeToSslAsync yöntemi iki parametre alır. protectionLevel parametresi istenen koruma düzeyini gösterir. validationHostName parametresi, SSL'ye yükseltirken doğrulama için kullanılan uzak ağ hedefinin ana bilgisayar adıdır. Normalde validationHostName , uygulamanın başlangıçta bağlantıyı kurmak için kullandığı ana bilgisayar adıyla aynı olur. UpgradeToSslAsync çağrılırken protectionLevel parametresi Windows.System.Socket.SocketProtectionLevel.Ssl olarak ayarlanmışsa, StreamSocket soket üzerinden yapılacak sonraki iletişimlerde şifreleme için SSL/TLS kullanmalıdır. Bu değer şifreleme gerektirir ve null şifrelemenin kullanılmasına hiçbir zaman izin vermez.

UpgradeToSslAsync yöntemiyle kullanılacak normal sıra aşağıdaki gibidir:

  • StreamSocket oluşturun.
  • Sokette gelişmiş bir seçeneğe ihtiyaç duyulursa, bir StreamSocket nesnesiyle ilişkilendirilmiş StreamSocketControl örneğini almak için StreamSocket.Control özelliğini kullanın. StreamSocketControl üzerinde bir özellik ayarlayın.
  • Herhangi bir verinin gönderilmesi ve şifrelenmemiş olarak alınması gerekiyorsa şimdi gönderin.
  • Bağlantıyı SSL/TLS kullanacak şekilde yükseltmek üzere bir işlem başlatmak için UpgradeToSslAsync yöntemini çağırın.
  • UpgradeToSslAsync kullanılarak gerçekte müzakere edilen SSL gücü, zaman uyumsuz işlem başarıyla tamamlandıktan sonra StreamSocketInformation.ProtectionLevel özelliği alınarak belirlenebilir.

Aşağıdaki örnek bir StreamSocket oluşturur, ağ hizmetine bağlantı kurmayı dener, bazı ilk verileri gönderir ve ardından SSL/TLS kullanmak için anlaşma yapar. Anlaşma başarılı olursa, istemci ile ağ sunucusu arasındaki StreamSocket kullanan tüm ağ iletişimi şifrelenir.

using Windows.Networking;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

    // Define some variables and set values
    StreamSocket clientSocket = new StreamSocket();
 
    HostName serverHost = new HostName("www.contoso.com");
    string serverServiceName = "http";

    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages 

    // Try to connect to contoso using HTTP (port 80)
    try {
        // Call ConnectAsync method with a plain socket
        await clientSocket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.PlainSocket);

        NotifyUser("Connected");

    }
    catch (Exception exception) {
        // If this is an unknown status it means that the error is fatal and retry will likely fail.
        if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {
            throw;
        }

        NotifyUser("Connect failed with error: " + exception.Message, NotifyType.ErrorMessage);
        // Could retry the connection, but for this simple example
        // just close the socket.

        clientSocket.Dispose();
        clientSocket = null; 
        return;
    }

    // Now try to send some data
    DataWriter writer = new DataWriter(clientSocket.OutputStream);
    string hello = "Hello, World! ☺ ";
    Int32 len = (int) writer.MeasureString(hello); // Gets the UTF-8 string length.
    writer.WriteInt32(len);
    writer.WriteString(hello);
    NotifyUser("Client: sending hello");

    try {
        // Call StoreAsync method to store the hello message
        await writer.StoreAsync();

        NotifyUser("Client: sent data");

        writer.DetachStream(); // Detach stream, if not, DataWriter destructor will close it.
    }
    catch (Exception exception) {
        NotifyUser("Store failed with error: " + exception.Message);
        // Could retry the store, but for this simple example
            // just close the socket.

            clientSocket.Dispose();
            clientSocket = null; 
            return;
    }

    // Now upgrade the client to use SSL
    try {
        // Try to upgrade to SSL
        await clientSocket.UpgradeToSslAsync(SocketProtectionLevel.Ssl, serverHost);

        NotifyUser("Client: upgrade to SSL completed");
           
        // Add code to send and receive data 
        // The close clientSocket when done
    }
    catch (Exception exception) {
        // If this is an unknown status it means that the error is fatal and retry will likely fail.
        if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {
            throw;
        }

        NotifyUser("Upgrade to SSL failed with error: " + exception.Message);

        clientSocket.Dispose();
        clientSocket = null; 
        return;
    }
#include <winrt/Windows.Networking.Sockets.h>
#include <winrt/Windows.Storage.Streams.h>

using namespace winrt;
using namespace Windows::Storage::Streams;
...
    // Define some variables, and set values.
    Windows::Networking::Sockets::StreamSocket clientSocket;

    Windows::Networking::HostName serverHost{ L"www.contoso.com" };
    winrt::hstring serverServiceName{ L"https" };

    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages. 

    // Try to connect to the server using HTTP (port 80).
    try
    {
        co_await clientSocket.ConnectAsync(serverHost, serverServiceName, Windows::Networking::Sockets::SocketProtectionLevel::PlainSocket);
        NotifyUser(L"Connected");
    }
    catch (winrt::hresult_error const& exception)
    {
        NotifyUser(L"Connect failed with error: " + exception.message());
        clientSocket = nullptr;
    }

    // Now, try to send some data.
    DataWriter writer{ clientSocket.OutputStream() };
    winrt::hstring hello{ L"Hello, World! ☺ " };
    uint32_t len{ writer.MeasureString(hello) }; // Gets the size of the string, in bytes.
    writer.WriteInt32(len);
    writer.WriteString(hello);
    NotifyUser(L"Client: sending hello");

    try
    {
        co_await writer.StoreAsync();
        NotifyUser(L"Client: sent hello");

        writer.DetachStream(); // Detach the stream when you want to continue using it; otherwise, the DataWriter destructor closes it.
    }
    catch (winrt::hresult_error const& exception)
    {
        NotifyUser(L"Store failed with error: " + exception.message());
        // We could retry the store operation. But, for this simple example, just close the socket by setting it to nullptr.
        clientSocket = nullptr;
        co_return;
    }

    // Now, upgrade the client to use SSL.
    try
    {
        co_await clientSocket.UpgradeToSslAsync(Windows::Networking::Sockets::SocketProtectionLevel::Tls12, serverHost);
        NotifyUser(L"Client: upgrade to SSL completed");

        // Add code to send and receive data using the clientSocket,
        // then set the clientSocket to nullptr when done to close it.
    }
    catch (winrt::hresult_error const& exception)
    {
        // If this is an unknown status, then the error is fatal and retry will likely fail.
        Windows::Networking::Sockets::SocketErrorStatus socketErrorStatus{ Windows::Networking::Sockets::SocketError::GetStatus(exception.to_abi()) };
        if (socketErrorStatus == Windows::Networking::Sockets::SocketErrorStatus::Unknown)
        {
            throw;
        }

        NotifyUser(L"Upgrade to SSL failed with error: " + exception.message());
        // We could retry the store operation. But for this simple example, just close the socket by setting it to nullptr.
        clientSocket = nullptr;
        co_return;
    }
using Windows::Networking;
using Windows::Networking::Sockets;
using Windows::Storage::Streams;

    // Define some variables and set values
    StreamSocket^ clientSocket = ref new StreamSocket();
 
    HostName^ serverHost = ref new HostName("www.contoso.com");
    String^ serverServiceName = "http";

    // For simplicity, the sample omits implementation of the
    // NotifyUser method used to display status and error messages 

    // Try to connect to contoso using HTTP (port 80)
    task<void>(clientSocket->ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel::PlainSocket)).then([this] (task<void> previousTask) {
        try
        {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.Get();
            NotifyUser("Connected");
        }
        catch (Exception^ exception)
        {
            NotifyUser("Connect failed with error: " + exception->Message);
 
            clientSocket->Close();
            clientSocket = null;
        }
    });
       
    // Now try to send some data
    DataWriter^ writer = ref new DataWriter(clientSocket->OutputStream);
    String^ hello = "Hello, World! ☺ ";
    Int32 len = (int) writer->MeasureString(hello); // Gets the UTF-8 string length.
    writer->WriteInt32(len);
    writer->WriteString(hello);
    NotifyUser("Client: sending hello");

    task<void>(writer->StoreAsync()).then([this] (task<void> previousTask) {
        try {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.Get();

            NotifyUser("Client: sent hello");

            writer->DetachStream(); // Detach stream, if not, DataWriter destructor will close it.
       }
       catch (Exception^ exception) {
               NotifyUser("Store failed with error: " + exception->Message);
               // Could retry the store, but for this simple example
               // just close the socket.
 
               clientSocket->Close();
               clientSocket = null;
               return;
       }
    });

    // Now upgrade the client to use SSL
    task<void>(clientSocket->UpgradeToSslAsync(SocketProtectionLevel::Ssl, serverHost)).then([this] (task<void> previousTask) {
        try {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.Get();

           NotifyUser("Client: upgrade to SSL completed");
           
           // Add code to send and receive data 
           // Then close clientSocket when done
        }
        catch (Exception^ exception) {
            // If this is an unknown status it means that the error is fatal and retry will likely fail.
            if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {
                throw;
            }

            NotifyUser("Upgrade to SSL failed with error: " + exception.Message);

            clientSocket->Close();
            clientSocket = null; 
            return;
        }
    });

Güvenli WebSocket bağlantıları oluşturma

Geleneksel yuva bağlantıları gibi WebSocket bağlantıları da bir Windows uygulaması için StreamWebSocket ve MessageWebSocket özellikleri kullanılırken Aktarım Katmanı Güvenliği (TLS)/Güvenli Yuva Katmanı (SSL) ile şifrelenebilir. Çoğu durumda güvenli bir WebSocket bağlantısı kullanmak istersiniz. Bu, birçok proxy şifrelenmemiş WebSocket bağlantılarını reddedeceği için bağlantınızın başarılı olma olasılığını artırır.

Ağ hizmetine güvenli yuva bağlantısı oluşturma veya bu hizmete yükseltme örnekleri için bkz. TLS/SSL ile WebSocket bağlantılarının güvenliğini sağlama.

TLS/SSL şifrelemesine ek olarak, bir sunucu ilk el sıkışmasını tamamlamak için Sec-WebSocket-Protocol üst bilgi değeri gerektirebilir. StreamWebSocketInformation.Protocol ve MessageWebSocketInformation.Protocol özellikleriyle temsil edilen bu değer, bağlantının protokol sürümünü gösterir ve sunucunun açılış el sıkışmasını ve daha sonra değiş tokuş edilen verileri doğru yorumlamasını sağlar. Bu protokol bilgilerini kullanarak, herhangi bir noktada sunucu gelen verileri güvenli bir şekilde yorumlayamazsa bağlantı kapatılabilir.

İstemciden gelen ilk istek bu değeri içermiyorsa veya sunucunun beklediğiyle eşleşmeyen bir değer sağlıyorsa, beklenen değer sunucudan WebSocket el sıkışma hatasında istemciye gönderilir.

Kimlik Doğrulaması

Ağ üzerinden bağlanırken kimlik doğrulama bilgileri nasıl sağlanır.

StreamSocket sınıfıyla bir istemci sertifikası sağlama

Windows. Networking.Sockets.StreamSocket sınıfı, uygulamanın konuştuğu sunucunun kimliğini doğrulamak için SSL/TLS kullanılmasını destekler. Bazı durumlarda, uygulamanın tls istemci sertifikası kullanarak sunucuda kimliğini doğrulaması da gerekir. Windows 10'da StreamSocket.Control nesnesinde bir istemci sertifikası sağlayabilirsiniz (TLS el sıkışması başlatılmadan önce bu ayarlanmalıdır). Sunucu istemci sertifikasını isterse, Windows sağlanan sertifikayla yanıt verir.

Bunun nasıl uygulandığını gösteren bir kod parçacığı aşağıdadır:

var socket = new StreamSocket();
Windows.Security.Cryptography.Certificates.Certificate certificate = await GetClientCert();
socket.Control.ClientCertificate = certificate;
await socket.ConnectAsync(destination, SocketProtectionLevel.Tls12);

Bir web hizmetine kimlik doğrulama bilgileri sağlama

Uygulamaların güvenli web hizmetleriyle etkileşim kurmasını sağlayan ağ API'lerinin her biri bir istemciyi başlatmak veya sunucu ve proxy kimlik doğrulaması kimlik bilgileriyle bir istek üst bilgisi ayarlamak için kendi yöntemlerini sağlar. Her yöntem, kullanıcı adını, parolayı ve bu kimlik bilgilerinin kullanıldığı kaynağı gösteren bir PasswordCredential nesnesiyle ayarlanır. Aşağıdaki tabloda bu API'lerin eşlemesi sağlanmaktadır:

WebSockets MessageWebSocketControl.ServerCredential
MessageWebSocketControl.ProxyCredential
StreamWebSocketControl.ServerCredential
StreamWebSocketControl.ProxyCredential
Arka Plan Aktarımı BackgroundDownloader.ServerCredential
BackgroundDownloader.ProxyCredential
BackgroundUploader.ServerCredential
BackgroundUploader.ProxyCredential
Dağıtım SyndicationClient(PasswordCredential)
SyndicationClient.ServerCredential
SyndicationClient.ProxyCredential
AtomPub AtomPubClient(PasswordCredential)
AtomPubClient.ServerCredential
AtomPubClient.ProxyCredential

Ağ özel durumlarını işleme

Programlamanın çoğu alanında özel durum, programdaki bir kusurun neden olduğu önemli bir sorunu veya hatayı gösterir. Ağ programlamada özel durumlar için ek bir kaynak vardır: ağın kendisi ve ağ iletişiminin doğası. Ağ iletişimleri doğal olarak güvenilir değildir ve beklenmeyen hatalara eğilimlidir. Uygulamanızın ağ kullanma yollarından her biri için bazı durum bilgilerini korumanız gerekir; ve uygulama kodunuz bu durum bilgilerini güncelleştirerek ve uygulamanızın iletişim hatalarını yeniden kurması veya yeniden denemesi için uygun mantığı başlatarak ağ özel durumlarını işlemelidir.

Evrensel Windows uygulamaları özel durum oluştururken, özel durum işleyiciniz hatayı daha iyi anlamak ve uygun kararlar almak için özel durumun nedeni hakkında daha ayrıntılı bilgi alabilir.

Her dil projeksiyonu, bu daha ayrıntılı bilgilere erişmek için bir yöntemi destekler. Evrensel Windows uygulamalarında bir özel durum, HRESULT değeri olarak yansıtılır. Winerror.h include dosyası, ağ hatalarını içeren olası HRESULT değerlerinin çok büyük bir listesini içerir.

Ağ API'leri, özel durumun nedeni hakkında bu ayrıntılı bilgileri almak için farklı yöntemleri destekler.

  • Bazı API'ler , HRESULT değerini özel durumdan numaralandırma değerine dönüştüren bir yardımcı yöntem sağlar.
  • Diğer API'ler gerçek HRESULT değerini almak için bir yöntem sağlar.