下面就把我当时做的方法分享,希望对大家有用。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的茄子河网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!1,首先在webconfig中配置需要的信息
注:RewardUrl为url地址中公用的部分,因为后面调用不同的接口,地址是不一样的,所以就抽出来单独定义了,CommonUrl为IP+端口号,因为这个地址有可能更换所以也单独定义了。
<appSettings> <addkey="CerPath" value="E:\avantouch.pfx" /> <addkey="CommonUrl" value="https://192.168.1.1:15121"/> <addkey="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
网站栏目:C#通过httppost方式调用需要证书的webservice-创新互联
新闻来源:https://www.cdcxhl.com/article26/cspjjg.html
成都网站建设公司_创新互联,为您提供响应式网站、企业网站制作、域名注册、定制网站、网站营销、商城网站
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联