Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ağ özellikli herhangi bir uygulama için yapmanız gerekenler.
Yetenekler
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.
| Kapasite | Açıklama |
|---|---|
| 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. |
| özelAğİstemciSunucu | 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.
| Kapasite | Açıklama |
|---|---|
| kurumsalKimlikDoğrulama | Bir uygulamanın etki alanı kimlik bilgileri gerektiren ağ kaynaklarına bağlanmasına izin verir. Örneğin, özel intranetteki SharePoint sunucularından 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ı özelliklerEnterprise 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
Uygulamanızı arka plan görevleriyle destekleme, uygulamanız ön planda olmadığında çalışmak için arka plan görevlerini kullanma hakkında genel bilgiler içerir. Daha açık belirtmek gerekirse, geçerli ön plan uygulaması olmadığında ve veriler ağ üzerinden geldiğinde kodunuzun bildirim almak için özel adımlar atması gerekir. Windows 8'de bu amaçla Denetim Kanalı Tetikleyicilerini kullandınız ve bunlar Windows 10'da hala destekleniyor. Denetim Kanalı Tetikleyicilerini kullanma hakkında tüm bilgilere buradan ulaşabilirsiniz. Windows 10'daki yeni bir teknoloji, itme özellikli akış soketleri gibi bazı durumlarda daha düşük yükle daha iyi işlevsellik sağlar: soket aracı 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. Soket aracısı, yeni trafiğin geldiğini SocketActivityTrigger ile uygulamanıza bildirir. Uygulamanız soket aracısından soketi geri alır ve soketteki trafiği yönetir. 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ı, aynı işlevselliği sağladığından ancak daha az kısıtlama ve daha küçük bir bellek ayak iziyle, uygun olduğu durumlarda denetim kanalı tetikleyicilerinin yerini almak üzere tasarlanmıştır. Socket broker, kilit ekranı uygulamaları olmayan uygulamalar tarafından kullanılabilir ve telefonlarda diğer cihazlarda olduğu gibi aynı şekilde kullanılır. Soket aracı tarafından etkinleştirilebilmesi için trafik geldiğinde uygulamaların çalışıyor olması 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.
- IXMLHTTPRequest2, System.Net.Http.HttpClient veya System.Net.Http.HttpClientHandler kullanıyorsanız, ControlChannelTrigger kullanmalısınız.
push özellikli StreamSockets kullanıyorsanız, denetim kanalı tetikleyicilerini kullanabilirsiniz, ancak SocketActivityTrigger tercih etmelisiniz. İkinci seçenek, bağlantı etkin olarak kullanılmadığında sistemin bellek boşaltmasını ve güç gereksinimlerini azaltmasını sağlar.- Ağ isteklerine etkin bir şekilde hizmet vermediğinde uygulamanızın bellek ayak izini en aza indirmek istiyorsanız, mümkün olduğunda SocketActivityTrigger'ı tercih edin.
- Sistem Bağlı Bekleme modundayken uygulamanızın veri alabilmesini istiyorsanız SocketActivityTrigger'ı kullanın.
Soket aracısı kullanma hakkında ayrıntılı bilgi 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.
Asenkron 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 edinebilirsiniz. Ancak bu, bağlantının kullandığı gerçek koruma düzeyini yansıtmaz.
Uyarı
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. İki adet ConnectAsync yöntemi vardır, protectionLevel parametresinin geçirilmesini destekleyen.
- ConnectAsync(EndpointPair, SocketProtectionLevel) - EndpointPair nesnesi ve SocketProtectionLevel olarak belirtilen uzak bir ağ hedefine bağlanmak için StreamSocket nesnesinde zaman uyumsuz bir işlem başlatır.
- ConnectAsync(HostName, String, SocketProtectionLevel) - Uzak konak adı, uzak hizmet adı ve SocketProtectionLevel tarafından belirtilen uzak hedefe bağlanmak için StreamSocket nesnesinde zaman uyumsuz bir işlem başlatır.
Yukarıdaki ConnectAsync yöntemlerinden birini çağırırken protectionLevel parametresi Windows.Networking.Sockets.SocketProtectionLevel.Ssl olarak ayarlanırsa, şifreleme için SSL/TLS kullanmak üzere StreamSocket oluşturulmalıdır. 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.
- StreamSocketoluşturun.
- Gelişmiş bir seçenek sokette gerekiyorsa, StreamSocket nesnesiyle ilişkilendirilmiş StreamSocketControl örneğini almak için StreamSocket.Control özelliğini kullanın. StreamSocketControl üzerinde bir özellik ayarlayın.
- Uzak bir hedefe bağlanmak için bir işlem başlatmak ve SSL/TLS kullanımı konusunda hemen anlaşmak için yukarıdaki ConnectAsync yöntemlerinden birini çağırın.
- ConnectAsync kullanılarak müzakere edilen SSL gücü, asenkron işlem başarıyla tamamlandıktan sonra StreamSocketinformation.ProtectionLevel özelliği alınarak belirlenebilir.
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 ile ağ sunucusu arasındaki StreamSocket kullanan tüm ağ iletişimi ş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 = new ref StreamSocket();
HostName^ serverHost = new ref 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. protectionLevel parametresi, UpgradeToSslAsyncyolu ile çağırıldığında Windows.System.Socket.SocketProtectionLevel.Ssl olarak ayarlanırsa, StreamSocket yuva üzerinde takip eden 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:
- StreamSocketoluşturun.
- Gelişmiş bir seçenek sokette gerekiyorsa, 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 yapılan SSL güvenlik düzeyi, zaman uyumsuz işlem başarılı bir şekilde tamamlandıktan sonra StreamSocketinformation.ProtectionLevel özelliği alınarak tespit edilebilir.
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 = new ref StreamSocket();
Hostname^ serverHost = new ref 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 = new ref 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(clientSocket.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 UWP 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ğrulama
Ağ üzerinden bağlanırken kimlik doğrulama bilgilerini sağlama.
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 kullanmayı 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);
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:
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, bir HRESULT değeri olarak yansı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.