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#示例,其他语言拼接字符串的原理是一样的

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

  1. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  2. C语言下WebService的使用方式

    用gSoap工具:      1.在dos环境中到gSoap工具对应的目录gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32路径下,执行wsdl2h -c -o *.h ht ...

  3. 使用swig工具为go语言与c++进行交互

    环境: centos_7_x86_x64,gcc_4.8.5 一.安装swig 1. 安装pcre yum install -y pcre pcre-tools pcre-devel 2. 安装yac ...

  4. Android之SOAP协议与WebService服务器交互,解决超时的问题

    网络搜索大部分不能实际解决问题.特意将解决方法写下.创建MyAndroidHttpTransport 类 , package com.example.omhandroid.lib; import or ...

  5. C语言实现的文件交互

    计算机与外部设备的交互依靠文件完成 文件是记录在外部介质上的数据的集合:例如1.c 是源码 1.exe可执行的文件 文件的分类 按组织结构: 记录文件:有一定结构的文件,可以解析成字段值的文件: 流式 ...

  6. 免费利用网页版谷歌翻译实现任意语言转换php版

    本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...

  7. webService接口交互

    1.需要在XXXXX.wsdl中配置相应的类与service方法. 2.启动你的项目,打开浏览器,输入地址:http://localhost:8080/lis/services,就能看到你XXXXX. ...

  8. WebSerivce测试工具 Storm

    STORM 是一款免费且开源的WebSerivce测试工具 它的功能: 1,测试任意语言测试 WebService 2,可动态调用webservice的方法,即使输入参数需要使用复杂的数据类型 3,节 ...

  9. webservice CXF 相关面试题

    Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...

随机推荐

  1. Swift版的SQLiteHelper

    SQLiteHelper 创建SQLiteHelper类 /// SQLite数据库处理帮助类 /// /// 此类中封装了关于SQLite数据库处理的业务函数 class SQLiteHelper ...

  2. W5500 keep-alive的用途与用法--新华龙电子

    大家是否遇到过这样的问题,W5500作为服务器已经建立连接,突然网线掉了,然后再去连接W5500,就连不上了.为什么?下面对这个问题进行解释说明,并提出解决办法. 图1中的上位机程序作为客户端,连接W ...

  3. ajaxpro返回值类型总结-DataTable(转)

    ajaxpro使用总结系列其他内容 ajaxpro ajaxmethod 重载调用问题 ajaxpro方法ajaxmethod调用示例 ajaxpro返回值类型总结-string,int ajaxpr ...

  4. [转载]tlb、tlh和tli文件的关系

    tlb.tlh和tli文件的关系 tlb文件:com类型库文件.在需要使用对应com类的模块里,“#import ...*.tlb”使用之. tlh.tli文件:他们是vc++编译器解析tlb文件生成 ...

  5. 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

    来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...

  6. QTP操作txt文档

    QTP可以在txt文件(文本文件中读取数据) 首先创造一个文档对象 set fso = createObject("scripting.filesystemobject") 然后用 ...

  7. 关于iOS10的允许访问用户数据产生的问题

    不知道这个问题是什么时候出现的,直到我重写项目已应对IPv6的审核. 先前没有加引导页面,打开app直接进入主控制器.当弹出允许访问用户数据窗口的时候,主页面的数据是不加载的. 当用户未允许访问数据之 ...

  8. Opencv出现错误“0xc000007b”的解决办法

    装了一下午的opencv.之前用VS2010装过opencv,当时使用的是cmake编译源码的办法,这个方法好处就是不用每新建一个工程就重新链接opencv库文件.今天装了个VS2013,再装open ...

  9. OC Runtime

    OC 是面向运行时的语言.Runtime就是系统在运行的时候的一些机制,其中最主要的是消息发送机制.OC语言与其他语言(如C语言)在函数(方法)的调用有很大的不同.C语言,函数的调用在编译的时候就已经 ...

  10. Windows IIS 安装配置PHP环境

    一. 概述 二.安装PHP 1.到php官网下载最新版PHP http://windows.php.net/download 三.配置IIS PHP环境