ServicePoint 类
阅读原文时间:2023年07月15日阅读:1

地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.servicepoint?view=netframework-4.7.2

提供 HTTP 连接的连接管理。

下面的代码示例创建一个ServicePoint连接到 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;
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/");  
    }  
}  

}

ServicePoint类根据传递给资源的统一资源标识符 (URI) 中的主机信息来处理与 Internet 资源的连接。

与资源的初始连接将确定ServicePoint对象维护的信息, 该信息随后由对该资源的所有后续请求共享。

ServicePoint对象由ServicePointManager类管理, 并根据需要ServicePointManager.FindServicePoint由方法创建。

ServicePoint永远不会直接创建对象, 而是始终由ServicePointManager类创建和管理对象。

可创建的最ServicePoint大对象数ServicePointManager.MaxServicePoints由属性设置。

ServicePoint个对象都保持与 Internet 资源的连接, 直到它的空闲时间超过MaxIdleTime在属性中指定的时间。

ServicePointMaxIdleTime超出该值时, 可以将其回收到其他连接。

的默认值MaxIdleTime ServicePointManager.MaxServicePointIdleTime由属性设置。

如果将ServicePoint属性设置为-1 以外的值, 并且在指定的时间过后, 则在服务下一个请求后将关闭活动连接。

ConnectionLeaseTimeout 这对于不需要无限期打开的活动连接的应用程序非常有用, 因为这些应用程序默认为。

-----------------------------------

demo没有调通,proxy 找不到一个合适的值;

………………

暂时未解决。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章