话不多说,直接上代码

最近开发一个需求,涉及获取服务端https证书。一般进行https调用我们都不太关心底层细节,直接使用WebClient或者HttpWebRequest来发送请求,这两种方法都无法获取证书信息,需要用到ServicePoint,这个类用于提供HTTP连接的管理。


写在开头

1.1
本节内容

内存填充函数memset()中的坑。

var target = pattern.Target;
var name = pattern.Name;
var fpElem = FillPatternElement.GetFillPatternElementByName(doc, target, name);

using (var tran = new Transaction(doc, "FillPattern"))
{
       tran.Start();
       var selectionIds = app.ActiveUIDocument.Selection.GetElementIds();
       if (selectionIds != null && selectionIds.Any())
       {
            foreach (var id in selectionIds)
            {
                    FilledRegion elem = doc.GetElement(id) as FilledRegion;
                    if (elem != null && !elem.IsMasking)
                    {                                
                          OverrideGraphicSettings overrideGraphicSettings = new OverrideGraphicSettings();
                          overrideGraphicSettings = doc.ActiveView.GetElementOverrides(elem.Id);
                          overrideGraphicSettings.SetProjectionFillPatternId(fpElem.Id);
                          doc.ActiveView.SetElementOverrides(elem.Id, overrideGraphicSettings);
                    }
             }                        
        }
        tran.Commit();
}

 


函数原型

 

写个Demo,拿新浪首页试一下:

1 /* 来自man memset */
2 #include <string.h>
3 void * memset(void * s, int c, size_t n);
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;

namespace GetServerCertificateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //用WebClient访问新浪首页
            var http = new WebClient();
            var uri = new Uri("https://www.sina.com.cn");
            http.DownloadString(uri);

            //通过Uri获取ServicePoint
            var servicePoint = ServicePointManager.FindServicePoint(uri);

            //取服务端证书,X509Certificate格式,转一下
            var serverCert = new X509Certificate2(servicePoint.Certificate);
            Console.WriteLine("颁发给:{0}", serverCert.Subject);
            Console.WriteLine("颁发者:{0}", serverCert.Issuer);
            Console.WriteLine("序列号:{0}", serverCert.SerialNumber);
            Console.WriteLine("指  纹:{0}", serverCert.Thumbprint);
            Console.WriteLine("起  始:{0}", serverCert.NotBefore);
            Console.WriteLine("过  期:{0}", serverCert.NotAfter);
        }
    }
}

功能描述:memset()函数用常量c的值填充由指针s所指向的内存地址空间的前n个字节的内存空间。

 

DESCRIPTION
: The memset() function fills the first n bytes of the memory area
pointed to by s with the constant byte c.

运行看效果:

 

图片 1

参数:
void
* s – 指向要被填充的内存空间的首地址
int c

上半部分是程序运行结果,下面是用Firefox查看的服务端证书信息,各项信息都能对应上。如果程序中涉及多个不同服务器的访问也没关系,关键在于根据Uri获取ServicePoint,然后取到的证书就是此服务器的了。

  • 一个常量
    size_t
    n – 要被填充的字节数

 

 

返回值:
memset()函数是有返回值的,从函数原型也可以看出来。memset()函数返回一个指向内存空间s的指针。

RETURN
VALUE : The memset() function returns a pointer to the memory area
s.

 


填坑运动

3.1
第一个坑

先举一个memset()正确的应用场景。下面的代码能够很好地运行,完全能够达到目的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注