PageRenderTime 35ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/Senparc.Weixin.MP/Senparc.Weixin.MP/RequestMessageFactory.cs

https://github.com/mjhuangzk/WeiXinMPSDK
C# | 115 lines | 82 code | 7 blank | 26 comment | 2 complexity | 84c89bf2295c24c92c2d1910c3563b79 MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Xml;
  7. namespace Senparc.Weixin.MP
  8. {
  9. using System.Xml.Linq;
  10. using Senparc.Weixin.MP.Entities;
  11. using Senparc.Weixin.MP.Helpers;
  12. public static class RequestMessageFactory
  13. {
  14. //<?xml version="1.0" encoding="utf-8"?>
  15. //<xml>
  16. // <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  17. // <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
  18. // <CreateTime>1357986928</CreateTime>
  19. // <MsgType><![CDATA[text]]></MsgType>
  20. // <Content><![CDATA[中文]]></Content>
  21. // <MsgId>5832509444155992350</MsgId>
  22. //</xml>
  23. /// <summary>
  24. /// 获取XDocument转换后的IRequestMessageBase实例。
  25. /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
  26. /// </summary>
  27. /// <returns></returns>
  28. public static IRequestMessageBase GetRequestEntity(XDocument doc)
  29. {
  30. RequestMessageBase requestMessage = null;
  31. RequestMsgType msgType;
  32. try
  33. {
  34. msgType = MsgTypeHelper.GetRequestMsgType(doc);
  35. switch (msgType)
  36. {
  37. case RequestMsgType.Text:
  38. requestMessage = new RequestMessageText();
  39. break;
  40. case RequestMsgType.Location:
  41. requestMessage = new RequestMessageLocation();
  42. break;
  43. case RequestMsgType.Image:
  44. requestMessage = new RequestMessageImage();
  45. break;
  46. case RequestMsgType.Voice:
  47. requestMessage = new RequestMessageVoice();
  48. break;
  49. case RequestMsgType.Link:
  50. requestMessage = new RequestMessageLink();
  51. break;
  52. case RequestMsgType.Event:
  53. //判断Event类型
  54. switch (doc.Root.Element("Event").Value.ToUpper())
  55. {
  56. case "ENTER"://进入会话
  57. requestMessage = new RequestMessageEvent_Enter();
  58. break;
  59. case "LOCATION"://地理位置
  60. requestMessage = new RequestMessageEvent_Location();
  61. break;
  62. case "SUBSCRIBE"://订阅(关注)
  63. requestMessage = new RequestMessageEvent_Subscribe();
  64. break;
  65. case "UNSUBSCRIBE"://取消订阅(关注)
  66. requestMessage = new RequestMessageEvent_Unsubscribe();
  67. break;
  68. default://其他意外类型(也可以选择抛出异常)
  69. requestMessage = new RequestMessageEventBase();
  70. break;
  71. }
  72. break;
  73. default:
  74. throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
  75. }
  76. EntityHelper.FillEntityWithXml(requestMessage, doc);
  77. }
  78. catch (ArgumentException ex)
  79. {
  80. throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
  81. }
  82. return requestMessage;
  83. }
  84. /// <summary>
  85. /// 获取XDocument转换后的IRequestMessageBase实例。
  86. /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
  87. /// </summary>
  88. /// <returns></returns>
  89. public static IRequestMessageBase GetRequestEntity(string xml)
  90. {
  91. return GetRequestEntity(XDocument.Parse(xml));
  92. }
  93. /// <summary>
  94. /// 获取XDocument转换后的IRequestMessageBase实例。
  95. /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
  96. /// </summary>
  97. /// <param name="stream">如Request.InputStream</param>
  98. /// <returns></returns>
  99. public static IRequestMessageBase GetRequestEntity(Stream stream)
  100. {
  101. using (XmlReader xr = XmlReader.Create(stream))
  102. {
  103. var doc = XDocument.Load(xr);
  104. return GetRequestEntity(doc);
  105. }
  106. }
  107. }
  108. }