ServicePoint Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia zarządzanie połączeniami http.
public ref class ServicePoint
public class ServicePoint
type ServicePoint = class
Public Class ServicePoint
- Dziedziczenie
-
ServicePoint
Przykłady
Poniższy przykład kodu tworzy ServicePoint obiekt, który łączy się z identyfikatorem URI www.contoso.com
.
// This example shows how to use the ServicePoint and ServicePointManager classes.
// The ServicePointManager class uses the ServicePoint class to manage connections
// to a remote host. The networking classes reuse service points for all
// requests to a given URI. In fact, the same ServicePoint object
// is used to issue requests to Internet resources identified by the same
// scheme identifier (for example, HTTP) and host fragment (for example, www.contoso.com).
// This should improve your application performance.
// Reusing service points in this way can help improve application performance.
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::Threading;
using namespace System::Text::RegularExpressions;
void ShowProperties( ServicePoint^ sp )
{
Console::WriteLine( "Done calling FindServicePoint()..." );
// Display the ServicePoint Internet resource address.
Console::WriteLine( "Address = {0}", sp->Address );
// Display the date and time that the ServicePoint was last
// connected to a host.
Console::WriteLine( "IdleSince = {0}", sp->IdleSince );
// Display the maximum length of time that the ServicePoint instance
// is allowed to maintain an idle connection to an Internet
// resource before it is recycled for use in another connection.
Console::WriteLine( "MaxIdleTime = {0}", sp->MaxIdleTime );
Console::WriteLine( "ConnectionName = {0}", sp->ConnectionName );
// Display the maximum number of connections allowed on this
// ServicePoint instance.
Console::WriteLine( "ConnectionLimit = {0}", sp->ConnectionLimit );
// Display the number of connections associated with this
// ServicePoint instance.
Console::WriteLine( "CurrentConnections = {0}", sp->CurrentConnections );
if ( sp->Certificate == nullptr )
Console::WriteLine( "Certificate = (null)" );
else
Console::WriteLine( "Certificate = {0}", sp->Certificate );
if ( sp->ClientCertificate == nullptr )
Console::WriteLine( "Client Certificate = (null)" );
else
Console::WriteLine( "Client Certificate = {0}", sp->ClientCertificate );
Console::WriteLine( "ProtocolVersion = {0}", sp->ProtocolVersion->ToString() );
Console::WriteLine( "SupportsPipelining = {0}", sp->SupportsPipelining );
Console::WriteLine( "UseNagleAlgorithm = {0} ", sp->UseNagleAlgorithm.ToString() );
Console::WriteLine( "Expect 100-continue = {0}", sp->Expect100Continue.ToString() );
}
void makeWebRequest( int hashCode, String^ Uri )
{
HttpWebResponse^ res = nullptr;
// Make sure that the idle time has elapsed, so that a new
// ServicePoint instance is created.
Console::WriteLine( "Sleeping for 2 sec." );
Thread::Sleep( 2000 );
try
{
// Create a request to the passed URI.
HttpWebRequest^ req = dynamic_cast<HttpWebRequest^>(WebRequest::Create( Uri ));
Console::WriteLine( "\nConnecting to {0} ............", Uri );
// Get the response object.
res = dynamic_cast<HttpWebResponse^>(req->GetResponse());
Console::WriteLine( "Connected.\n" );
ServicePoint^ currentServicePoint = req->ServicePoint;
// Display new service point properties.
int currentHashCode = currentServicePoint->GetHashCode();
Console::WriteLine( "New service point hashcode: {0}", currentHashCode );
Console::WriteLine( "New service point max idle time: {0}", currentServicePoint->MaxIdleTime );
Console::WriteLine( "New service point is idle since {0}", currentServicePoint->IdleSince );
// Check that a new ServicePoint instance has been created.
if ( hashCode == currentHashCode )
Console::WriteLine( "Service point reused." );
else
Console::WriteLine( "A new service point created." );
}
catch ( Exception^ e )
{
Console::WriteLine( "Source : {0}", e->Source );
Console::WriteLine( "Message : {0}", e->Message );
}
finally
{
if ( res != nullptr )
res->Close();
}
}
// Show the user how to use this program when wrong inputs are entered.
void showUsage()
{
Console::WriteLine( "Enter the proxy name as follows:" );
Console::WriteLine( "\tcs_servicepoint proxyName" );
}
int main()
{
array<String^>^args = Environment::GetCommandLineArgs();
int port = 80;
// Define a regular expression to parse the user's input.
// This is a security check. It allows only
// alphanumeric input strings between 2 to 40 characters long.
Regex^ rex = gcnew Regex( "^[a-zA-Z]\\w{1,39}$" );
if ( args->Length < 2 )
{
showUsage();
return -1;
}
String^ proxy = args[ 1 ];
if ( (rex->Match(proxy))->Success != true )
{
Console::WriteLine( "Input string format not allowed." );
return -1;
}
String^ proxyAdd = String::Format( "http://{0}:{1}", proxy, port );
// Create a proxy object.
WebProxy^ DefaultProxy = gcnew WebProxy( proxyAdd,true );
// Set the proxy that all HttpWebRequest instances use.
WebRequest::DefaultWebProxy = DefaultProxy;
// Get the base interface for proxy access for the
// WebRequest-based classes.
IWebProxy^ Iproxy = WebRequest::DefaultWebProxy;
// Set the maximum number of ServicePoint instances to
// maintain. If a ServicePoint instance for that host already
// exists when your application requests a connection to
// an Internet resource, the ServicePointManager object
// returns this existing ServicePoint instance. If none exists
// for that host, it creates a new ServicePoint instance.
ServicePointManager::MaxServicePoints = 4;
// Set the maximum idle time of a ServicePoint instance to 10 seconds.
// After the idle time expires, the ServicePoint object is eligible for
// garbage collection and cannot be used by the ServicePointManager.
ServicePointManager::MaxServicePointIdleTime = 10000;
ServicePointManager::UseNagleAlgorithm = true;
ServicePointManager::Expect100Continue = true;
ServicePointManager::CheckCertificateRevocationList = true;
ServicePointManager::DefaultConnectionLimit = ServicePointManager::DefaultPersistentConnectionLimit;
// Create the Uri object for the resource you want to access.
Uri^ MS = gcnew Uri( "http://msdn.microsoft.com/" );
// Use the FindServicePoint method to find an existing
// ServicePoint object or to create a new one.
ServicePoint^ servicePoint = ServicePointManager::FindServicePoint( MS, Iproxy );
ShowProperties( servicePoint );
int hashCode = servicePoint->GetHashCode();
Console::WriteLine( "Service point hashcode: {0}", hashCode );
// Make a request with the same scheme identifier and host fragment
// used to create the previous ServicePoint object.
makeWebRequest( hashCode, "http://msdn.microsoft.com/library/" );
}
// This example shows how to use the ServicePoint and ServicePointManager classes.
// The ServicePointManager class uses the ServicePoint class to manage connections
// to a remote host. The networking classes reuse service points for all
// requests to a given URI. In fact, the same ServicePoint object
// is used to issue requests to Internet resources identified by the same
// scheme identifier (for example, HTTP) and host fragment (for example, www.contoso.com).
// This should improve your application performance.
// Reusing service points in this way can help improve application performance.
using System;
using System.Net;
using System.Threading;
using System.Text.RegularExpressions;
namespace Mssc.Services.ConnectionManagement
{
class TestServicePoint
{
private static void ShowProperties(ServicePoint sp)
{
Console.WriteLine("Done calling FindServicePoint()...");
// Display the ServicePoint Internet resource address.
Console.WriteLine("Address = {0} ", sp.Address.ToString());
// Display the date and time that the ServicePoint was last
// connected to a host.
Console.WriteLine("IdleSince = " + sp.IdleSince.ToString());
// Display the maximum length of time that the ServicePoint instance
// is allowed to maintain an idle connection to an Internet
// resource before it is recycled for use in another connection.
Console.WriteLine("MaxIdleTime = " + sp.MaxIdleTime);
Console.WriteLine("ConnectionName = " + sp.ConnectionName);
// Display the maximum number of connections allowed on this
// ServicePoint instance.
Console.WriteLine("ConnectionLimit = " + sp.ConnectionLimit);
// Display the number of connections associated with this
// ServicePoint instance.
Console.WriteLine("CurrentConnections = " + sp.CurrentConnections);
if (sp.Certificate == null)
Console.WriteLine("Certificate = (null)");
else
Console.WriteLine("Certificate = " + sp.Certificate.ToString());
if (sp.ClientCertificate == null)
Console.WriteLine("ClientCertificate = (null)");
else
Console. WriteLine("ClientCertificate = " + sp.ClientCertificate.ToString());
Console.WriteLine("ProtocolVersion = " + sp.ProtocolVersion.ToString());
Console.WriteLine("SupportsPipelining = " + sp.SupportsPipelining);
Console.WriteLine("UseNagleAlgorithm = " + sp.UseNagleAlgorithm.ToString());
Console.WriteLine("Expect 100-continue = " + sp.Expect100Continue.ToString());
}
private static void makeWebRequest(int hashCode, string Uri)
{
HttpWebResponse res = null;
// Make sure that the idle time has elapsed, so that a new
// ServicePoint instance is created.
Console.WriteLine("Sleeping for 2 sec.");
Thread.Sleep(2000);
try
{
// Create a request to the passed URI.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uri);
Console.WriteLine("\nConnecting to " + Uri + " ............");
// Get the response object.
res = (HttpWebResponse)req.GetResponse();
Console.WriteLine("Connected.\n");
ServicePoint currentServicePoint = req.ServicePoint;
// Display new service point properties.
int currentHashCode = currentServicePoint.GetHashCode();
Console.WriteLine("New service point hashcode: " + currentHashCode);
Console.WriteLine("New service point max idle time: " + currentServicePoint.MaxIdleTime);
Console.WriteLine("New service point is idle since " + currentServicePoint.IdleSince );
// Check that a new ServicePoint instance has been created.
if (hashCode == currentHashCode)
Console.WriteLine("Service point reused.");
else
Console.WriteLine("A new service point created.") ;
}
catch (Exception e)
{
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
finally
{
if (res != null)
res.Close();
}
}
// Show the user how to use this program when wrong inputs are entered.
private static void showUsage()
{
Console.WriteLine("Enter the proxy name as follows:");
Console.WriteLine("\tcs_servicepoint proxyName");
}
public static void Main(string[] args)
{
int port = 80;
// Define a regular expression to parse the user's input.
// This is a security check. It allows only
// alphanumeric input strings between 2 to 40 characters long.
Regex rex = new Regex(@"^[a-zA-Z]\w{1,39}$");
if (args.Length < 1)
{
showUsage();
return;
}
string proxy = args[0];
if ((rex.Match(proxy)).Success != true)
{
Console.WriteLine("Input string format not allowed.");
return;
}
string proxyAdd = "http://" + proxy + ":" + port;
// Create a proxy object.
WebProxy DefaultProxy = new WebProxy(proxyAdd, true);
// Set the proxy that all HttpWebRequest instances use.
WebRequest.DefaultWebProxy = DefaultProxy;
// Get the base interface for proxy access for the
// WebRequest-based classes.
IWebProxy Iproxy = WebRequest.DefaultWebProxy;
// Set the maximum number of ServicePoint instances to
// maintain. If a ServicePoint instance for that host already
// exists when your application requests a connection to
// an Internet resource, the ServicePointManager object
// returns this existing ServicePoint instance. If none exists
// for that host, it creates a new ServicePoint instance.
ServicePointManager.MaxServicePoints = 4;
// Set the maximum idle time of a ServicePoint instance to 10 seconds.
// After the idle time expires, the ServicePoint object is eligible for
// garbage collection and cannot be used by the ServicePointManager object.
ServicePointManager.MaxServicePointIdleTime = 10000;
ServicePointManager.UseNagleAlgorithm = true;
ServicePointManager.Expect100Continue = true;
ServicePointManager.CheckCertificateRevocationList = true;
ServicePointManager.DefaultConnectionLimit = ServicePointManager.DefaultPersistentConnectionLimit;
// Create the Uri object for the resource you want to access.
Uri MS = new Uri("http://msdn.microsoft.com/");
// Use the FindServicePoint method to find an existing
// ServicePoint object or to create a new one.
ServicePoint servicePoint = ServicePointManager.FindServicePoint(MS, Iproxy);
ShowProperties(servicePoint);
int hashCode = servicePoint.GetHashCode();
Console.WriteLine("Service point hashcode: " + hashCode);
// Make a request with the same scheme identifier and host fragment
// used to create the previous ServicePoint object.
makeWebRequest(hashCode, "http://msdn.microsoft.com/library/");
}
}
}
' This example shows how to use the ServicePoint and ServicePointManager classes.
' The ServicePointManager class uses the ServicePoint class to manage connections
' to a remote host. The networking classes reuse service points for all
' requests to a given URI. In fact, the same ServicePoint object
' is used to issue requests to Internet resources identified by the same
' scheme identifier (for example, HTTP) and host fragment (for example, www.contoso.com).
' Reusing service points in this way can help improve application performance.
Imports System.Net
Imports System.Threading
Imports System.Text.RegularExpressions
Namespace Mssc.Services.ConnectionManagement
Module M_TestServicePoint
Class TestServicePoint
Private Shared Sub ShowProperties(ByVal sp As ServicePoint)
Console.WriteLine("Done calling FindServicePoint")
' Display the ServicePoint Internet resource address.
Console.WriteLine(("Address = " + sp.Address.ToString()))
' Display the date and time that the ServicePoint was last
' connected to a host.
Console.WriteLine(("IdleSince = " + sp.IdleSince.ToString()))
' Display the maximum length of time that the ServicePoint instance
' is allowed to maintain an idle connection to an Internet
' resource before it is recycled for use in another connection.
Console.WriteLine(("MaxIdleTime = " + sp.MaxIdleTime.ToString()))
Console.WriteLine(("ConnectionName = " + sp.ConnectionName))
' Display the maximum number of connections allowed on this
' ServicePoint instance.
Console.WriteLine(("ConnectionLimit = " + sp.ConnectionLimit.ToString()))
' Display the number of connections associated with this
' ServicePoint instance.
Console.WriteLine(("CurrentConnections = " + sp.CurrentConnections.ToString()))
If sp.Certificate Is Nothing Then
Console.WriteLine("Certificate = (null)")
Else
Console.WriteLine(("Certificate = " + sp.Certificate.ToString()))
End If
If sp.ClientCertificate Is Nothing Then
Console.WriteLine("ClientCertificate = (null)")
Else
Console.WriteLine(("ClientCertificate = " + sp.ClientCertificate.ToString()))
End If
Console.WriteLine("ProtocolVersion = " + sp.ProtocolVersion.ToString())
Console.WriteLine(("SupportsPipelining = " + sp.SupportsPipelining.ToString()))
Console.WriteLine("UseNagleAlgorithm = " + sp.UseNagleAlgorithm.ToString())
Console.WriteLine("Expect 100-continue = " + sp.Expect100Continue.ToString())
End Sub
Private Shared Sub makeWebRequest(ByVal hashCode As Integer, ByVal Uri As String)
Dim res As HttpWebResponse = Nothing
' Make sure that the idle time has elapsed, so that a new
' ServicePoint instance is created.
Console.WriteLine("Sleeping for 2 sec.")
Thread.Sleep(2000)
Try
' Create a request to the passed URI.
Dim req As HttpWebRequest = CType(WebRequest.Create(Uri), HttpWebRequest)
Console.WriteLine((ControlChars.Lf + "Connecting to " + Uri + " ............"))
' Get the response object.
res = CType(req.GetResponse(), HttpWebResponse)
Console.WriteLine("Connected." + ControlChars.Lf)
Dim currentServicePoint As ServicePoint = req.ServicePoint
' Display new service point properties.
Dim currentHashCode As Integer = currentServicePoint.GetHashCode()
Console.WriteLine(("New service point hashcode: " + currentHashCode.ToString()))
Console.WriteLine(("New service point max idle time: " + currentServicePoint.MaxIdleTime.ToString()))
Console.WriteLine(("New service point is idle since " + currentServicePoint.IdleSince.ToString()))
' Check that a new ServicePoint instance has been created.
If hashCode = currentHashCode Then
Console.WriteLine("Service point reused.")
Else
Console.WriteLine("A new service point created.")
End If
Catch e As Exception
Console.WriteLine(("Source : " + e.Source))
Console.WriteLine(("Message : " + e.Message))
Finally
If Not (res Is Nothing) Then
res.Close()
End If
End Try
End Sub
' Show the user how to use this program when wrong inputs are entered.
Private Shared Sub showUsage()
Console.WriteLine("Enter the proxy name as follows:")
Console.WriteLine(ControlChars.Tab + "vb_servicepoint proxyName")
End Sub
' This is the program entry point. It allows the user to enter
' a server name that is used to locate its current homepage.
Public Shared Sub Main(ByVal args() As String)
Dim proxy As String = Nothing
Dim port As Integer = 80
' Define a regular expression to parse the user's input.
' This is a security check. It allows only
' alphanumeric input strings between 2 to 40 characters long.
Dim rex As New Regex("^[a-zA-Z]\w{1,39}$")
If args.Length = 0 Then
' Show how to use this program.
showUsage()
Return
End If
proxy = args(0)
If (Not (rex.Match(proxy)).Success) Then
Console.WriteLine("Input string format not allowed.")
Return
End If
' Create a proxy object.
Dim proxyAdd As String
proxyAdd = "http://" + proxy + ":" + port.ToString()
Dim DefaultProxy As New WebProxy(proxyAdd, True)
' Set the proxy that all HttpWebRequest instances use.
WebRequest.DefaultWebProxy = DefaultProxy
' Get the base interface for proxy access for the
' WebRequest-based classes.
Dim Iproxy As IWebProxy = WebRequest.DefaultWebProxy
' Set the maximum number of ServicePoint instances to maintain.
' Note that, if a ServicePoint instance for that host already
' exists when your application requests a connection to
' an Internet resource, the ServicePointManager object
' returns this existing ServicePoint. If none exists
' for that host, it creates a new ServicePoint instance.
ServicePointManager.MaxServicePoints = 4
' Set the maximum idle time of a ServicePoint instance to 10 seconds.
' After the idle time expires, the ServicePoint object is eligible for
' garbage collection and cannot be used by the ServicePointManager.
ServicePointManager.MaxServicePointIdleTime = 10000
ServicePointManager.UseNagleAlgorithm = True
ServicePointManager.Expect100Continue = True
ServicePointManager.CheckCertificateRevocationList = True
ServicePointManager.DefaultConnectionLimit = _
ServicePointManager.DefaultPersistentConnectionLimit
' Create the Uri object for the resource you want to access.
Dim MS As New Uri("http://msdn.microsoft.com/")
' Use the FindServicePoint method to find an existing
' ServicePoint object or to create a new one.
Dim servicePoint As ServicePoint = ServicePointManager.FindServicePoint(MS, Iproxy)
ShowProperties(servicePoint)
Dim hashCode As Integer = servicePoint.GetHashCode()
Console.WriteLine(("Service point hashcode: " + hashCode.ToString()))
' Make a request with the same scheme identifier and host fragment
' used to create the previous ServicePoint object.
makeWebRequest(hashCode, "http://msdn.microsoft.com/library/")
End Sub
End Class
End Module
End Namespace
Uwagi
Klasa ServicePoint obsługuje połączenia z zasobem internetowym na podstawie informacji o hoście przekazanych w identyfikatorze URI (URI) zasobu zasobu. Początkowe połączenie z zasobem określa informacje, które ServicePoint utrzymuje obiekt, który jest następnie współużytkowany przez wszystkie kolejne żądania do tego zasobu.
ServicePoint obiekty są zarządzane przez klasę ServicePointManager i są tworzone w razie potrzeby przez metodę ServicePointManager.FindServicePoint . ServicePoint obiekty nigdy nie są tworzone bezpośrednio, ale zawsze są tworzone i zarządzane przez klasę ServicePointManager . Maksymalna liczba ServicePoint obiektów, które można utworzyć, jest ustawiana przez ServicePointManager.MaxServicePoints właściwość .
Każdy ServicePoint obiekt utrzymuje połączenie z zasobem internetowym, dopóki nie będzie on bezczynny dłużej niż czas określony we MaxIdleTime właściwości. Gdy wartość ServicePoint przekroczy MaxIdleTime wartość, można ją odzyskać do innego połączenia. Wartość domyślna jest MaxIdleTime ustawiana przez ServicePointManager.MaxServicePointIdleTime właściwość .
ConnectionLeaseTimeout Gdy właściwość jest ustawiona na wartość inną niż -1, a po upływie określonego czasu aktywne ServicePoint połączenie zostanie zamknięte po jego wykonaniu następnego żądania. Jest to przydatne w przypadku aplikacji, które nie wymagają aktywnych połączeń, które są otwierane na czas nieokreślony, ponieważ są domyślnie.
Uwaga
W warunkach dużego obciążenia niektóre aplikacje mogą zabrakło wolnych wątków w puli wątków, co może prowadzić do niskiej wydajności systemu (takich jak wysokie i zmienne czasy transakcji).
Ważne
Nie zalecamy używania ServicePoint
klasy do nowego programowania. Zamiast tego użyj System.Net.Http.HttpClient klasy .
Właściwości
Address |
Pobiera identyfikator URI (Uniform Resource Identifier) serwera, z którego ServicePoint ten obiekt nawiązuje połączenie. |
BindIPEndPointDelegate |
Określa delegata do skojarzenia lokalnego IPEndPoint z elementem ServicePoint. |
Certificate |
Pobiera certyfikat odebrany dla tego ServicePoint obiektu. |
ClientCertificate |
Pobiera ostatni certyfikat klienta wysłany do serwera. |
ConnectionLeaseTimeout |
Pobiera lub ustawia liczbę milisekund, po których aktywne ServicePoint połączenie jest zamknięte. |
ConnectionLimit |
Pobiera lub ustawia maksymalną liczbę połączeń dozwolonych w tym ServicePoint obiekcie. |
ConnectionName |
Pobiera nazwę połączenia. |
CurrentConnections |
Pobiera liczbę otwartych połączeń skojarzonych z tym ServicePoint obiektem. |
Expect100Continue |
Pobiera lub ustawia wartość określającą Boolean , czy jest używane zachowanie 100-Kontynuuj. |
IdleSince |
Pobiera datę i godzinę ServicePoint ostatniego połączenia obiektu z hostem. |
MaxIdleTime |
Pobiera lub ustawia czas, przez jaki połączenie skojarzone z ServicePoint obiektem może pozostać bezczynne, zanim połączenie zostanie zamknięte. |
ProtocolVersion |
Pobiera wersję protokołu HTTP używanego przez ServicePoint obiekt. |
ReceiveBufferSize |
Pobiera lub ustawia rozmiar buforu odbierającego dla gniazda używanego przez ten ServicePointelement . |
SupportsPipelining |
Wskazuje, ServicePoint czy obiekt obsługuje połączenia potokowe. |
UseNagleAlgorithm |
Pobiera lub ustawia wartość określającą Boolean , czy algorytm Nagle jest używany na połączeniach zarządzanych przez ten ServicePoint obiekt. |
Metody
CloseConnectionGroup(String) |
Usuwa określoną grupę połączeń z tego ServicePoint obiektu. |
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetHashCode() |
Zwraca wartość skrótu ServicePoint dla wystąpienia. |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
SetTcpKeepAlive(Boolean, Int32, Int32) |
Włącza lub wyłącza opcję utrzymania aktywności w połączeniu TCP. |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Dotyczy
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla