前一段时间做花旗银行的项目,用到花旗的接口是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, , 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

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

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

    最近在朋友弄一个调整省政府政务工作流的程序.. 需要把当前的信息推送到政务网上,采用的是带证书的https webservice.. 下面说一下实现过程 第一步,引用webservice地址,删除we ...

  2. 微信公众平台HTTPS方式调用配置免费https服务器

    微信公众平台数据传输安全,提高业务安全性,公众平台将不再支持HTTP方式调用.避免影响正常使用中含有HTTP方式调用的服务,请开发者尽快调整,将现有通过HTTP方式调用的切换成HTTPS调用,平台将于 ...

  3. .Net Core 发送https请求/.net core 调用数字证书 使用X509Certificate2

    .Net Core 发送https请求 .net core 调用数字证书 使用X509Certificate2 .NET下面的 .netfromwork使用和asp.net core下使用方式不一样 ...

  4. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  5. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  6. HttpClient Get/Post方式调用Http接口

    本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myeclipse6.5 .tomcat5.0.system:xp.JD ...

  7. C#以post方式调用struts rest-plugin service的问题

    struts2: 玩转 rest-plugin一文中,学习了用struts2开发restful service的方法,发现用c#以post方式调用时各种报错,但java.ajax,包括firefox ...

  8. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

  9. Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

    如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...

随机推荐

  1. Java基础语法(自定义类、ArrayList集合)

    Java基础语法 今日内容介绍 u 自定义类 u ArrayList集合 第1章 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类 ...

  2. pixhawk 固件Firmware内执行make px4fmu-v2_default 编译报错解决办法

    执行下列指令报错 make px4fmu-v2_default /bin/sh: 1: Tools/check_cmake.sh: Permission denied Makefile:44: Not ...

  3. swift基础-3

    fallthrough 贯穿 case  可以不必写break 如果不需要知道区间内 每一项的值  可以使用 下划线 —— 来代替变量名 忽略 对该值的访问 for index in 1...5{ p ...

  4. <Android Framework 之路>多线程

    多线程编程 JAVA多线程方式 1. 继承Thread线程,实现run方法 2. 实现Runnable接口 JAVA单继承性,当我们想将一个已经继承了其他类的子类放到Thread中时,单继承的局限就体 ...

  5. jquery解析xml,获取xml标签名

    先给一个简单的XML,结构如下 <?xml version="1.0" encoding="uft-8" ?> <msg> <ro ...

  6. JavaScript命名——name不能做变量名

    使用name作为变量名(var name = ‘’),在IE中未引起bug,在Chrome中引起bug但未明确指出命名错误,而是会报其他错误,故不便于发现. 现象原因: javascript中name ...

  7. SharePoint Server和Office 365之间的混合模式集成概述

    正如您可能已经知道的那样,云中的Microsoft Office 365和SharePoint Server 2013/2016内部部署可以通过多种方式协同工作.这些通常被称为混合模式,因为它们将功能 ...

  8. tomcat的work目录不是缓存

    最近发现,很多网友喜欢把tomcat的work目录里的东西叫做缓存,其实那不是很恰当,work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它 ...

  9. N17_判断树B是不是树A的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) package new_offer; /** * 输入两棵二叉树A,B,判断B是不是A的子结构.( ...

  10. 绘制方式和OpenGL枚举对应关系

    绘制方式和OpenGL枚举对应关系 图元类型 OpenGL枚举量 点 GL_POINTS 线 GL_LINES 条带线 GL_LINE_STRIP 循环线 GL_LINE_LOOP 独立三角形 GL_ ...