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就可以得到你想要的结果了。

总结完毕,有总结不对的地方请帮忙指出,也希望对您的学习工作有用。我的邮件:[email protected]

C#通过http post方式调用需要证书的webservice,布布扣,bubuko.com

时间: 2024-08-10 19:19:07

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

asp.net 调用带证书的webservice解决办法

最近在朋友弄一个调整省政府政务工作流的程序.. 需要把当前的信息推送到政务网上,采用的是带证书的https webservice.. 下面说一下实现过程 第一步,引用webservice地址,删除web.config中相关配置.同时安装好证书 用如下数据替换: [html] view plain copy <system.serviceModel> <bindings> <customBinding> <binding name="IServiceSoa

RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式时,任务中是不允许访问特权级寄存器的,这个时候使用 SVC 中断,此问题就迎刃而解了. SVC 功能介绍SVC 用于产生系统函数的调用请求.例如,操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件.因此,当用户程序想要控制特定的硬件时,它就要产生一个 SVC 异常,然后操作系统提供的SVC

JavaScript中以构造函数的方式调用函数

转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明.函数表达式或者函数构造器(见以前的随笔)等方式来构造函数对象.函数构造器和其它函数的区别在与它们的调用方式不同. 要以构造函数的方式调用函数,只需要在调用时在函数名称前加new 关键字,比如:function whatsMyContext(){ return this; }; 调用:new what

Delphi编写DLL(以及静态和动态方式调用)

Delphi编写DLL(以及静态和动态方式调用) 作者/cadenza7 什么是DLL? DLL是Dynamic Link Library(动态链接库)的缩写形式.DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译.链接并与使用它们的进程分开存储的函数.DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容

FineReport中以jws方式调用WebService数据源方案

在使用WebService作为项目的数据源时,希望报表中也是直接调用这个WebService数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢? 在程序中访问WebService应用服务,将WebService返回的数据转为程序数据集,然后在设计器中调用. 以axis1.4上的WebService为例,介绍其取数方式以及将数据转换为WebService的程序数据集的过程. WebService应用服务 如在Tomcat下的Axis工程中以jwa方式发布了一个WebService应用服

SSIS使用OleDB和Ado.Net两种方式调用 存储过程

在使用"执行 SQL 任务"组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Name的0代表第一个参数,1代表第二个参数 当我们使用Ado.net 方式的时候,注意要设置IsQueryStoredProcedure为True Sqlstatement 填写存储过程的名字 而参数设置需要和存储过程的参数名字保持一致 就到这了,欢迎大家来补充解释... SSIS使用OleD

用HTTP方式调用gearman任务处理

本来以为是个挺美好的东西,结果... 这样的方式非常不安全,尤其是假设暴露在公网地址,非常easy被攻击,并且gearman的http服务远没有专业的webserver健壮. 攻击方式非常easy:telnet host 8080,连接成功后,随便输入点内容,如:aaa,gearman日志就不停的出现例如以下错误信息: bad request line:aaa 简直就是死循环,gearmand就顶不住了,系统内存也一会就被耗尽,说明http这块实现的有BUG. 只是能够通过改动源代码来修复这个B

使用ajax和urlconnection方式调用webservice服务

<html> <head> <title>使用ajax方式调用webservice服务</title> <script> var xhr = new XMLHttpRequest(); function sendAjax(){ var url = "http://192.168.13.66:8080/hello";//webservice服务的地址 var requestBody = '<soapenv:Envelope

idhttp.post方式 调用datasnap rest 远程方法

idhttp.get方式调用,这种比较简单,大家都会.post方式网上却没有任何成功的代码,本人也是摸索了一个上午才搞定. 分享给大家. (1)post方式调用的远程方法,方法名必须加“update”前缀,不加行不?你试下啦. function TServerMethods1.updateecho(const value: String): String;beginResult := value;end; (2)客户端调用,参数必须是JSON格式的字符串. 客户端POST方式调用时,远程方法名必