C#通过http post方式调用需要证书的webservice

        前一段时间做花旗银行的项目,用到花旗的接口是websevice,由于很多原因直接在项目中引用webservice不成功,于是就用了http post方式请求,把请求信息(xml格式)组装之后发送到服务器,返回结果。

下面就把我当时做的方法分享,希望对大家有用。

1,首先在webconfig中配置需要的信息

注:RewardUrl为url地址中公用的部分,因为后面调用不同的接口,地址是不一样的,所以就抽出来单独定义了,CommonUrl为IP+端口号,因为这个地址有可能更换所以也单独定义了。
<appSettings>
    <add key="CerPath"  value="E:\\avantouch.pfx" />
    <add key="CommonUrl"  value="https://192.168.1.1:15121"/>
    <add key="RewardUrl" value="/SvcImpl/cards/reward/"/>
  </appSettings>

2,定义全局变量,获取webconfig中的值,以及后面要用到的变量

   private static readonly string CommonUrl = ConfigurationManager.AppSettings["CommonUrl"].ToString();
   private static readonly string RewardUrl = ConfigurationManager.AppSettings["RewardUrl"].ToString();
   private static readonly string CerPath = ConfigurationManager.AppSettings["CerPath"].ToString();
   string PostUrl = "";

3,写公共的方法,这个方法我子啊项目中多个地方要用到,看似很多余的,可以整合到下面的方法中,但是在我的这个项目中需要这样会比较方便,所以我没有整合,大家可以根据自己的需要进行整合。

复制代码
        /// <summary>
        /// 获取结果(这个方法主要是获取PostUrl 然后调用下面的方法)
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="interfaceName">需要调用的对方接口方法名</param>
        /// <returns></returns>
        private string GetResCode(string xml, string interfaceName)
        {
            PostUrl = RewardUrl + interfaceName;//ip以及端口号之后的地址
            byte[] data = Encoding.UTF8.GetBytes(xml.ToString());
            string resCode = GetPostRequest(data, PostUrl);//方法在下面
            Log.Info("Response:" + resCode);
            return resCode;
        }
复制代码

4,写第三部中的代码用到的方法,这部比较重要。

复制代码
/// <summary>
        /// Post方式请求获取返回值
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private string GetPostRequest(byte[] data, string url)
        {
            try
            {
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(CommonUrl + url);//完整的请求地址(ip:端口号/+url)

        //X509证书
                X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(CerPath, "证书密码", X509KeyStorageFlags.MachineKeySet);
                myRequest.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

                //设定验证回调(总是同意)
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
myRequest.Method = "POST"; myRequest.ContentType = "text/xml;charset=\"utf-8\""; myRequest.Accept = "text/xml"; myRequest.Headers.Add("SOAPAction", url);//我做的过程中,这一步没加的时候一直出错,加上了这个就OK了。//是否和请求一起发送 myRequest.UseDefaultCredentials = true; myRequest.ContentLength = data.Length; myRequest.ClientCertificates.Add(cert);//把证书添加进http请求中 Stream newStream = myRequest.GetRequestStream(); // Send the data. newStream.Write(data, 0, data.Length); newStream.Close(); // Get response var response = (HttpWebResponse)myRequest.GetResponse(); using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"))) { string result = reader.ReadToEnd(); reader.Close(); response.Close(); return result; } } catch (Exception ex) { Log.Info(ex); return ex.ToString(); } }
//回调方法
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { // 总是接受 return true; }
复制代码

5,方法完毕,这时候只要把你的xml报文传过去,和你要调用的接口名称传过去,调用第三步的方法,例如:

GetResCode(xml,“Login”),这样就返回了信息,我做的项目返回的是xml格式的信息,解析xml就可以得到你想要的结果了。

总结完毕,有总结不对的地方请帮忙指出,也希望对您的学习工作有用。我的邮件:shixudong3@yeah.net
posted @   shixudong  阅读(4989)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示