用任意语言与WebService进行交互

using System;
using System.Web.Services;
using YY.SmsPlatform.Common.Objects;
using YY.SmsPlatform.Common.UserInterface;
using System.Configuration;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml;
using System.Diagnostics;

namespace YY.SmsPlatform.UserInterface
{
    /// <summary>
    /// WebService 的摘要说明
    /// </summary>
    [WebService(Namespace = "https://dx.ipyy.net/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
    // [System.Web.Script.Services.ScriptService]
    public class WebService : System.Web.Services.WebService
    {
        /// <summary>
        /// 表示提交方式
        /// </summary>
        private const MsgOrigin msgOrigin = MsgOrigin.WebService;
        /// <summary>
        /// 请求地址
        /// </summary>
        private string _url = ConfigurationManager.AppSettings["ServerUrl"] + "webservice.asmx";
        /// <summary>
        /// 实例化WebService远程对象
        /// </summary>
        /// <summary>
        /// 发送短信接口
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="password">密码</param>
        /// <param name="sms">短信实体</param>
        /// <returns>发送状态</returns>
        [WebMethod(Description = "发送短信接口")]
        public SendResult SendSms(string userName, string password, SmsObject sms)
        {
            string content = SOAPMessage(userName, password, sms);
            string  rlts = GetSOAPMessage(_url, content);
            //string result =rlts.Result.Content.ReadAsStringAsync().Result;
            //SendHelper.WriteToSendXmlLog(result);
            Trace.TraceInformation(rlts);
            SendResult rlt=null;
            try
            {
                 rlt= Analysis(rlts);

            }
            catch (Exception ex)
            {

                Trace.TraceInformation("解析XML文件是发生错误!"+ex);
            }
            return rlt;

        }
        /// <summary>
        /// 解析XML文件
        /// </summary>
        /// <param name="strResult"></param>
        /// <returns></returns>
        private SendResult Analysis(string strResult)
        {
            //实例化XmlDocument
            var doc = new System.Xml.XmlDocument();
            //加载soap文件
            doc.LoadXml(strResult);
            //简化soap,XML文件
            string sendSmsResult = doc.DocumentElement["soap:Body"]["SendSmsResponse"].InnerXml;
            //重新加载简化后的xml文件
            doc.LoadXml(sendSmsResult);
            //xml 命名空间
            XmlNamespaceManager xmlns = new XmlNamespaceManager(doc.NameTable);
            //添加xml命名空间缩写
            xmlns.AddNamespace("H", "http://www.yysms.com/");
            //获取xml文件<StatusCode></StatusCode>节点下的文本值
            string payType = doc.SelectSingleNode("/H:SendSmsResult/H:PayType",xmlns).InnerText;
            string statusCode = doc.SelectSingleNode("/H:SendSmsResult/H:StatusCode", xmlns).InnerText;

            //PayType
            string msgid = doc.SelectSingleNode("/H:SendSmsResult/H:MsgId",xmlns).InnerText;
            string description = doc.SelectSingleNode("/H:SendSmsResult/H:Description",xmlns).InnerText;//Description
            string successCounts = doc.SelectSingleNode("/H:SendSmsResult/H:SuccessCounts",xmlns).InnerText;
            string billingCount = doc.SelectSingleNode("/H:SendSmsResult/H:BillingCount",xmlns).InnerText;
            string amount = doc.SelectSingleNode("/H:SendSmsResult/H:Amount",xmlns).InnerText;
            string balance = doc.SelectSingleNode("/H:SendSmsResult/H:Balance",xmlns).InnerText;
            string billingAmount = doc.SelectSingleNode("/H:SendSmsResult/H:BillingAmount",xmlns).InnerText;
            //用于返回的信息
            ResultCode resultCode = (ResultCode)Enum.Parse(typeof(ResultCode), statusCode);
            SendResult sendResult = new SendResult(resultCode, description, msgid, Convert.ToInt64(amount),
                Convert.ToInt32(successCounts)) { BillingCount = Convert.ToInt32(billingCount), Balance = Convert.ToDecimal(balance), BillingAmount = Convert.ToDecimal(billingAmount) };
            //SendResult r = new SendResult(mtStatus, msgid, gatawayCode, description);
            return sendResult;
        }
        /// <summary>
        /// 包装Soap协议XML文件
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="password">密码</param>
        ///<param name="sms">短信内容</param>
        /// <returns></returns>
        private string SOAPMessage(string userName, string password, SmsObject sms)
        {
            var sb = new StringBuilder();
            sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            sb.Append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">");
            sb.Append("<soap12:Body><SendSms xmlns=\"http://www.yysms.com/\">");
            sb.AppendFormat("<userName>{0}</userName>", userName);
            sb.AppendFormat("<password>{0}</password>", password);
            sb.AppendFormat("<sms><Msisdns>{0}</Msisdns>", sms.Msisdns);
            sb.AppendFormat("<SMSContent><![CDATA[{0}]]></SMSContent>", sms.SMSContent);
            sb.AppendFormat("<ExtNumber>{0}</ExtNumber>", sms.ExtNumber);
            string planSendTime = sms.PlanSendTime == null ? null : Convert.ToDateTime(sms.PlanSendTime).ToString("yyyy-MM-ddTHH:mm:ss");
            sb.AppendFormat("<PlanSendTime xsi:nil=\"true\">{0}</PlanSendTime></sms>", planSendTime);
            sb.Append("</SendSms></soap12:Body></soap12:Envelope>");
            return sb.ToString();
            //var sb = new StringBuilder();
            ////<?xml version="1.0" encoding="utf-8"?>
            //sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            ////<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
            //sb.Append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">");
            ////<soap12:Body><SendSms xmlns="http://www.yysms.com/">
            //sb.Append("<soap12:Body><SendSms xmlns=\"http://www.yysms.com/\">");
            ////<userName>string</userName>
            //sb.AppendFormat("<userName>{0}</userName>", userName);
            ////<password>string</password>
            //sb.AppendFormat("<password>{0}</password>", password);
            ////<sms><Msisdns>string</Msisdns>
            //sb.AppendFormat("<sms><Msisdns>{0}</Msisdns>", sms.Msisdns);
            ////<SMSContent>string</SMSContent>
            //sb.AppendFormat("<SMSContent><![CDATA[{0}]]></SMSContent>", sms.SMSContent);
            ////<ExtNumber>string</ExtNumber>
            //sb.AppendFormat("<ExtNumber>{0}</ExtNumber>", sms.ExtNumber);
            ////<PlanSendTime>dateTime</PlanSendTime>
            //sb.AppendFormat("<PlanSendTime>{0}</PlanSendTime></sms>", sms.PlanSendTime == null ? "null" : Convert.ToDateTime(sms.PlanSendTime).ToString("yyyy-MM-ddTHH:mm:ss"));
            ////</sms></SendSms></soap12:Body></soap12:Envelope>
            //sb.Append("</SendSms></soap12:Body></soap12:Envelope>");
            //return sb.ToString();
        }
        /// <summary>
        /// HttpClient异步请求
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private async Task<HttpResponseMessage> SendAsync(string uri, string content)
        {
            HttpContent strContent = new StringContent(content);
            strContent.Headers.Clear();

            strContent.Headers.Add("Content-Type", "application/soap+xml;charset=utf-8");//"application/soap+xml; charset=utf-8"
            //strContent.Headers.Add("Content-Length", content.Length.ToString());
            HttpClient client = new HttpClient();

            HttpResponseMessage task = await client.PostAsync(uri, strContent);

            return task;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private static string GetSOAPMessage(string uri, string content)
        {
            HttpClient client = new HttpClient();

            HttpContent stringContent = new StringContent(content);
            stringContent.Headers.Clear();
            stringContent.Headers.Add("Content-Type", "application/soap+xml;charset=utf-8");
            //stringContent.Headers.Add("Content-Length",content.Length.ToString());
            HttpRequestMessage request = new HttpRequestMessage();
            request.Content = stringContent;
            request.Method = HttpMethod.Post;
            //request.RequestUri = new UnicodeEncoding(uri);
            request.RequestUri = new Uri(uri);

            var rlt = client.SendAsync(request).Result;
            return rlt.Content.ReadAsStringAsync().Result;
        }

    }
    public class SmsObject
    {
        /// <summary>
        /// 表示手机号,多个用逗号分开。
        /// </summary>
        public string Msisdns { get; set; }
        /// <summary>
        /// 表示短信的完整内容,拆分前。
        /// </summary>
        public string SMSContent { get; set; }
        /// <summary>
        /// 表示扩展号码
        /// </summary>
        public string ExtNumber { get; set; }
        /// <summary>
        /// 表示定时发送的时间
        /// </summary>
        public DateTime? PlanSendTime { get; set; }

        internal SmsParam ToSmsParam()
        {
            return new SmsParam
            {
                Msisdns = this.Msisdns,
                SMSContent = this.SMSContent,
                PlanSendTime = this.PlanSendTime,
                ExtNumber = this.ExtNumber,
            };
        }
    }
}

本示例为C#示例,其他语言拼接字符串的原理是一样的

时间: 2024-11-02 13:01:37

用任意语言与WebService进行交互的相关文章

C语言访问webservice小例子

近期做的一个项目中,需要访问webservice获取一些json格式的数据.返回的页面内容只是json格式的数据,并不像实际页面那么复杂.所以不想再引入工具库,直接用socket简单实现了. 以下代码并不是实际项目源码,是我摘取出来整理成的一个小例子分享给大家.代码本身很容易理解,但是需要一些socket编程和http协议基础. #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc

webService接口交互

1.需要在XXXXX.wsdl中配置相应的类与service方法. 2.启动你的项目,打开浏览器,输入地址:http://localhost:8080/lis/services,就能看到你XXXXX.wsdl配置的类名和方法名(service) 3.此时你会看到,类名后面会有一个可以点击的wsdl的标签,点击进去就是类型相应类的内容.

WebSerivce测试工具 Storm

STORM 是一款免费且开源的WebSerivce测试工具 它的功能: 1,测试任意语言测试 WebService 2,可动态调用webservice的方法,即使输入参数需要使用复杂的数据类型 3,节省开发成本与时间.你完全不需要自己做一个测试WebService的客户端 4,一个UI测试多个WebService 5,编辑SOAP header 6,其他(自己找找新的功能 - -!) 下载地址:http://storm.codeplex.com/

转:使用基于Http的消息代替WebService的数据交互

http://blog.csdn.net/cyq1984/article/details/38041671 系统间交互的工作,随着信息化建设的发展,以及业界对SOA的认识及其带来的低TOC(总体拥有成本)等优势,越来越受到信息化水平较高的用户的重视. 这里先抛开SOA这样的架构规划,单纯就系统间整合的协议进行讨论. 系统间的交互或者成为整合(互联互通),早在信息化系统诞生的时候,就已经出现,只是并不明显,或者由于早期开发平台.开发语言等的单一性,这种需求并没有非常大的爆发出来. 随着信息化建设的

使用基于Http的消息代替WebService的数据交互

系统间交互的工作,随着信息化建设的发展,以及业界对SOA的认识及其带来的低TOC(总体拥有成本)等优势,越来越受到信息化水平较高的用户的重视. 这里先抛开SOA这样的架构规划,单纯就系统间整合的协议进行讨论. 系统间的交互或者成为整合(互联互通),早在信息化系统诞生的时候,就已经出现,只是并不明显,或者由于早期开发平台.开发语言等的单一性,这种需求并没有非常大的爆发出来. 随着信息化建设的发展,以及各种不同的开发语言的发展,跨语言的不同业务系统之间的交互,成为了摆在CIO们面前的一个大问题. 早

使用Go语言与Ethereum智能合约进行交互

尽管最近出现了麻烦,但Ethereum仍然是区块链空间中实现智能合约最重要的系统,而且这种情况似乎不太可能很快改变. 在我看来,技术本身具有很大的潜力,从学术的角度来看是非常有趣的,但正如前面提到的问题,之前展示出来了很多问题,区块链技术,智能合约,特别是带有Solidity的Ethereum生态系统是非常不成熟的,而且也没有准备好的黄金时段/生产用例. 然而,这是学习和了解这种技术的一个很好的机会,能够在应用程序奔溃前提前做准备. 在我之前的一篇文章中,我创建了一个小型应用程序,其中包含一个简

PHP与其他语言交互-总结

原网址将会不断更新 :   作程的技术博客  <PHP与其他语言交互-总结> it.zuocheng.net 软件或者系统,不同模块可能由不同的语言编写,必然会存在不同语言之间交互和通信的问题.本文站在PHP的角度,探讨PHP与其他语言交互的方式. 语言层面交互 使用胶水语言 胶水语言Shell scripts Python Ruby Lua Tcl Perl. 其本质是调用操作系统的输入与输出,由操作系统创建由其他语言写成的应用的新进程,再将其输出返回给PHP. 优点是简单容易实现. 缺点是

webservice restful rpc

webservice: 上世纪90年代流行的分布式技术,如DCOM,CORBA,RMI,范式是RPC,但各系统数据类型不一致,实现/调用机制不同,各系统间互通不可能.XML的出现,让数据类型一致了,SOAP的出现,让各系统可以相互调用了.Simple Object Access Protocol的原意是XML-RPC,但人们很快就发现方法调用太狭隘,而消息传递更加通用.WSDL即支持rpc/encoded也支持document/literal,但前者已成为历史遗留.webservices是soa

CeF3开发者系列之外篇——IE中JS与C++交互

使用IE内核开发客户端产品,系统和前端页面之间的交互,通常给开发和维护带来很大的便利性.但操作系统和前端之间的交互却是比较复杂的.具体来说就是脚本语言和编译语言的交互.在IE内核中html和css虽然不兼容,但是IE编程接口是完全一样的,这得益于微软的COM组件的结构化设计和实现.所以与IE交互,必须得先说一下COM,COM全称组件对象模型(Component Object Model). COM的基本思想很简单,所有的组件模块都提供一个最根本的接口, IUnkown,它有三个方法,AddRef