回《【开源】EFW框架系列文章索引

EFW框架源代码下载V1.1:http://pan.baidu.com/s/1qWJjo3U

EFW框架实例源代码下载:http://pan.baidu.com/s/1o6MAKCa

EFW框架中的WebService服务开发方式与传统的net项目中开发不太一样,传统的开发方式虽然也挺简单但在后面的发布部署还是挺麻烦的,而在EFW框架中开发Webservice就跟编写普通的C#代码一样,并不需要单独建WebService服务项目,不需要Asmx文件;所以发布WebService只要把编译好的Dll拷贝到Web程序目录中就行了;

另外我建议尽量少用WebService服务来开发业务功能,系统内部的功能实现用前三章的控制器方式就可以搞定,只有在需要与外部系统做接口时,可以用它来开发相关接口程序;

本章主要内容通过解读框架源代码来学习WebService服务是怎么实现的,以及学习这种设计模式;

本文要点:

1.如何开发WebService系统接口

2.WebService服务的设计思路

3.WebService服务基类的AbstractService的实现

4.通过服务名称解析WebService对象的WebServiceInvoker类的实现

5.利用wsdl生成WebService生成代理类

WebService服务源代码目录结构:

EFW框架控制器设计图:

1.如何开发WebService系统接口

如上图,Books项目中实现了书籍实例的一些Webservice系统接口,bookWebService.cs文件是和逻辑层代码放在一起的,并不需要单独建一个Webservice服务项目,也不需要建到Web项目中;对比一下上图普通的WebService服务,不需要BookService.asmx文件;

见上图,WebService服务接口的使用跟普通的Net 系统中的WebService是一样的,地址栏中输入WebService服务对象的名称就可以调用,但是注意名称一样但是必须用asmx为后缀名,因为服务器只解析这种后缀名称的文件映射到后台的WebService服务;上图开放了两个WebService服务方法SaveBook和SearchBook。

2.WebService服务的设计思路

当初设计这种开发模式的目的就是为了减少项目的个数,到现在整个框架的项目只有5个,而且只有5个项目却包括了Web、Winform和WCF三种系统的开发;这都是为了秉承框架中的核心思想“简洁”,结构的简单明了,代码的整洁干净;所以为了几个WebService接口而增加一个WebService项目觉得太划不来了,所以开始思考如何实现,后来在网上看到了一个帖子讲动态调用WebService服务的,具体哪个帖子现在找不到了,反正我就借鉴了过来融入到了框架中,终于解决了这个难题;WebServiceInvoker类就是动态解析WebService服务的实现代码;所有WebService服务对象都必须继承AbstractService基类,AbstractService基类封装了WebService服务公共的处理功能;

3.WebService服务基类的AbstractService的实现

AbstractService文件

  1. /// <summary>
  2. /// WebService基类
  3. /// </summary>
  4. public class AbstractService : WebService, INewObject, INewDao
  5. {
  6.  
  7. private AbstractDatabase _oleDb = null;
  8. private IUnityContainer _container = null;
  9. public AbstractDatabase oleDb
  10. {
  11. get
  12. {
  13. if (_oleDb == null)
  14. {
  15. _oleDb = FactoryDatabase.GetDatabase();
  16. _container = AppGlobal.container;
  17. }
  18. return _oleDb;
  19. }
  20. }
  21.  
  22. //声明Soap头实例
  23. public GlobalParam param = new GlobalParam();
  24.  
  25. #region IBindDb 成员
  26.  
  27. public void BindDb(AbstractDatabase Db, IUnityContainer container)
  28. {
  29. _oleDb = Db;
  30. _container = container;
  31. }
  32.  
  33. public T BindDb<T>(T model)
  34. {
  35. (model as IbindDb).BindDb(_oleDb, _container);
  36. return model;
  37. }
  38.  
  39. public List<T> ListBindDb<T>(List<T> list)
  40. {
  41. for (int i = ; i < list.Count; i++)
  42. {
  43. (list[i] as IbindDb).BindDb(_oleDb, _container);
  44. }
  45. return list;
  46. }
  47.  
  48. public AbstractDatabase GetDb()
  49. {
  50. return _oleDb;
  51. }
  52.  
  53. public IUnityContainer GetUnityContainer()
  54. {
  55. return _container;
  56. }
  57.  
  58. #endregion
  59.  
  60. #region INewObject 成员
  61. public T NewObject<T>()
  62. {
  63. T t = FactoryModel.GetObject<T>(_oleDb, _container, null);
  64. return t;
  65. }
  66.  
  67. public T NewObject<T>(string unityname)
  68. {
  69. T t = FactoryModel.GetObject<T>(_oleDb, _container, unityname);
  70. return t;
  71. }
  72.  
  73. #endregion
  74.  
  75. #region INewDao 成员
  76.  
  77. public T NewDao<T>()
  78. {
  79. T t = FactoryModel.GetObject<T>(_oleDb, _container, null);
  80. return t;
  81. }
  82.  
  83. public T NewDao<T>(string unityname)
  84. {
  85. T t = FactoryModel.GetObject<T>(_oleDb, _container, unityname);
  86. return t;
  87. }
  88.  
  89. #endregion
  90.  
  91. }

AbstractService基类的功能封装包括:

1)数据库操作对象oleDb,可以直接在WebService服务中编写SQL语句操作数据库

2)实例化ObjectModel对象和Dao对象的方法,在WebService服务中实例化对象不能用new关键字,只能用NewObject()和NewDao()内置方法;

4.通过服务名称解析WebService对象的WebServiceInvoker类的实现

WebServiceInvoker文件

  1. /// <summary>
  2. /// WebService处理对象
  3. /// </summary>
  4. public class WebServiceInvoker : IHttpHandlerFactory
  5. {
  6. private Type GetWebService(HttpRequest request, string serviceName)
  7. {
  8. Type serviceType = null;
  9. //for (int i = 0; i < AppGlobal.BusinessDll.Count; i++)
  10. //{
  11. // Assembly asmb = Assembly.LoadFrom(AppGlobal.AppRootPath + "bin\\" + AppGlobal.BusinessDll[i].Trim());
  12. // if (asmb != null)
  13. // {
  14. // Type ts = asmb.GetType(serviceName);
  15. // if (ts != null)
  16. // {
  17. // serviceType = ts;
  18. // break;
  19. // }
  20. // }
  21. //}
  22.  
  23. List<Type> cmd = (List<Type>)AppGlobal.cache.GetData("cmdWebService");
  24. serviceType = cmd.Find(x => x.Name == serviceName);
  25. return serviceType;
  26. }
  27.  
  28. public void ReleaseHandler(IHttpHandler handler)
  29. {
  30. var wshf = new System.Web.Services.Protocols.WebServiceHandlerFactory();
  31. wshf.ReleaseHandler(handler);
  32. }
  33.  
  34. public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
  35. {
  36. var webServiceType = GetWebService(context.Request, GetServiceName(url));
  37. var wshf = new System.Web.Services.Protocols.WebServiceHandlerFactory();
  38. var coreGetHandler = typeof(WebServiceHandlerFactory).GetMethod("CoreGetHandler", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
  39. var httpHandler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { webServiceType, context, context.Request, context.Response });
  40. return httpHandler;
  41. }
  42.  
  43. public static string GetServiceName(string url)
  44. {
  45. int index = url.LastIndexOf("/");
  46. int index2 = url.Substring(index).IndexOf(".");
  47. return url.Substring(index + , index2 - );
  48. }
  49.  
  50. public static void LoadWebService(List<string> BusinessDll, ICacheManager cache)
  51. {
  52. List<Type> webserviceList = new List<Type>();
  53.  
  54. for (int k = ; k < BusinessDll.Count; k++)
  55. {
  56. System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(EFWCoreLib.CoreFrame.Init.AppGlobal.AppRootPath + "bin/" + BusinessDll[k]);
  57. Type[] types = assembly.GetTypes();
  58. for (int i = ; i < types.Length; i++)
  59. {
  60. WebServiceAttribute[] webS = ((WebServiceAttribute[])types[i].GetCustomAttributes(typeof(WebServiceAttribute), true));
  61. if (webS.Length > )
  62. {
  63. webserviceList.Add(types[i]);
  64. }
  65. }
  66. }
  67.  
  68. cache.Add("cmdWebService", webserviceList);
  69. }
  70. }

WebServiceInvoker对象继承IHttpHandlerFactory接口并实现接口方法GetHandler和ReleaseHandler,还要在Web.Config配置文件中进行配置;

5.利用wsdl生成WebService生成代理类

生成命令:wsdl /language:c# /out:c:\bookWebService.cs http://localhost:51796/bookWebService.asmx?WSDL

操作步骤:

1)打开Net命令工具

2)复制上面的wsdl命令并执行,提示写入“c:\bookWebService.cs ”成功

3)再把“c:\bookWebService.cs ”的文件拷贝到需要调用WebService接口的项目中使用就可以了;

bookWebService文件

  1. //------------------------------------------------------------------------------
  2. // <auto-generated>
  3. // 此代码由工具生成。
  4. // 运行时版本:2.0.50727.5477
  5. //
  6. // 对此文件的更改可能会导致不正确的行为,并且如果
  7. // 重新生成代码,这些更改将会丢失。
  8. // </auto-generated>
  9. //------------------------------------------------------------------------------
  10.  
  11. using System;
  12. using System.ComponentModel;
  13. using System.Data;
  14. using System.Diagnostics;
  15. using System.Web.Services;
  16. using System.Web.Services.Protocols;
  17. using System.Xml.Serialization;
  18.  
  19. //
  20. // 此源代码由 wsdl 自动生成, Version=2.0.50727.1432。
  21. //
  22.  
  23. /// <remarks/>
  24. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  25. [System.Diagnostics.DebuggerStepThroughAttribute()]
  26. [System.ComponentModel.DesignerCategoryAttribute("code")]
  27. [System.Web.Services.WebServiceBindingAttribute(Name="bookWebServiceSoap", Namespace="http://tempuri.org/")]
  28. [System.Xml.Serialization.XmlIncludeAttribute(typeof(MarshalByRefObject))]
  29. public partial class bookWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
  30.  
  31. private System.Threading.SendOrPostCallback SaveBookOperationCompleted;
  32.  
  33. private System.Threading.SendOrPostCallback SearchBookOperationCompleted;
  34.  
  35. /// <remarks/>
  36. public bookWebService() {
  37. this.Url = "http://localhost:51796/bookWebService.asmx";
  38. }
  39.  
  40. /// <remarks/>
  41. public event SaveBookCompletedEventHandler SaveBookCompleted;
  42.  
  43. /// <remarks/>
  44. public event SearchBookCompletedEventHandler SearchBookCompleted;
  45.  
  46. /// <remarks/>
  47. [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SaveBook", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
  48. public void SaveBook(Book book) {
  49. this.Invoke("SaveBook", new object[] {
  50. book});
  51. }
  52.  
  53. /// <remarks/>
  54. public System.IAsyncResult BeginSaveBook(Book book, System.AsyncCallback callback, object asyncState) {
  55. return this.BeginInvoke("SaveBook", new object[] {
  56. book}, callback, asyncState);
  57. }
  58.  
  59. /// <remarks/>
  60. public void EndSaveBook(System.IAsyncResult asyncResult) {
  61. this.EndInvoke(asyncResult);
  62. }
  63.  
  64. /// <remarks/>
  65. public void SaveBookAsync(Book book) {
  66. this.SaveBookAsync(book, null);
  67. }
  68.  
  69. /// <remarks/>
  70. public void SaveBookAsync(Book book, object userState) {
  71. if ((this.SaveBookOperationCompleted == null)) {
  72. this.SaveBookOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSaveBookOperationCompleted);
  73. }
  74. this.InvokeAsync("SaveBook", new object[] {
  75. book}, this.SaveBookOperationCompleted, userState);
  76. }
  77.  
  78. private void OnSaveBookOperationCompleted(object arg) {
  79. if ((this.SaveBookCompleted != null)) {
  80. System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
  81. this.SaveBookCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
  82. }
  83. }
  84.  
  85. /// <remarks/>
  86. [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SearchBook", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
  87. public System.Data.DataTable SearchBook(string schar, int flag) {
  88. object[] results = this.Invoke("SearchBook", new object[] {
  89. schar,
  90. flag});
  91. return ((System.Data.DataTable)(results[]));
  92. }
  93.  
  94. /// <remarks/>
  95. public System.IAsyncResult BeginSearchBook(string schar, int flag, System.AsyncCallback callback, object asyncState) {
  96. return this.BeginInvoke("SearchBook", new object[] {
  97. schar,
  98. flag}, callback, asyncState);
  99. }
  100.  
  101. /// <remarks/>
  102. public System.Data.DataTable EndSearchBook(System.IAsyncResult asyncResult) {
  103. object[] results = this.EndInvoke(asyncResult);
  104. return ((System.Data.DataTable)(results[]));
  105. }
  106.  
  107. /// <remarks/>
  108. public void SearchBookAsync(string schar, int flag) {
  109. this.SearchBookAsync(schar, flag, null);
  110. }
  111.  
  112. /// <remarks/>
  113. public void SearchBookAsync(string schar, int flag, object userState) {
  114. if ((this.SearchBookOperationCompleted == null)) {
  115. this.SearchBookOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSearchBookOperationCompleted);
  116. }
  117. this.InvokeAsync("SearchBook", new object[] {
  118. schar,
  119. flag}, this.SearchBookOperationCompleted, userState);
  120. }
  121.  
  122. private void OnSearchBookOperationCompleted(object arg) {
  123. if ((this.SearchBookCompleted != null)) {
  124. System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
  125. this.SearchBookCompleted(this, new SearchBookCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
  126. }
  127. }
  128.  
  129. /// <remarks/>
  130. public new void CancelAsync(object userState) {
  131. base.CancelAsync(userState);
  132. }
  133. }
  134.  
  135. /// <remarks/>
  136. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  137. [System.SerializableAttribute()]
  138. [System.Diagnostics.DebuggerStepThroughAttribute()]
  139. [System.ComponentModel.DesignerCategoryAttribute("code")]
  140. [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
  141. public partial class Book : AbstractEntity {
  142.  
  143. private int idField;
  144.  
  145. private string bookNameField;
  146.  
  147. private decimal buyPriceField;
  148.  
  149. private System.DateTime buyDateField;
  150.  
  151. private int flagField;
  152.  
  153. /// <remarks/>
  154. public int Id {
  155. get {
  156. return this.idField;
  157. }
  158. set {
  159. this.idField = value;
  160. }
  161. }
  162.  
  163. /// <remarks/>
  164. public string BookName {
  165. get {
  166. return this.bookNameField;
  167. }
  168. set {
  169. this.bookNameField = value;
  170. }
  171. }
  172.  
  173. /// <remarks/>
  174. public decimal BuyPrice {
  175. get {
  176. return this.buyPriceField;
  177. }
  178. set {
  179. this.buyPriceField = value;
  180. }
  181. }
  182.  
  183. /// <remarks/>
  184. public System.DateTime BuyDate {
  185. get {
  186. return this.buyDateField;
  187. }
  188. set {
  189. this.buyDateField = value;
  190. }
  191. }
  192.  
  193. /// <remarks/>
  194. public int Flag {
  195. get {
  196. return this.flagField;
  197. }
  198. set {
  199. this.flagField = value;
  200. }
  201. }
  202. }
  203.  
  204. /// <remarks/>
  205. [System.Xml.Serialization.XmlIncludeAttribute(typeof(Book))]
  206. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  207. [System.SerializableAttribute()]
  208. [System.Diagnostics.DebuggerStepThroughAttribute()]
  209. [System.ComponentModel.DesignerCategoryAttribute("code")]
  210. [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
  211. public abstract partial class AbstractEntity : AbstractBusines {
  212. }
  213.  
  214. /// <remarks/>
  215. [System.Xml.Serialization.XmlIncludeAttribute(typeof(AbstractEntity))]
  216. [System.Xml.Serialization.XmlIncludeAttribute(typeof(Book))]
  217. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  218. [System.SerializableAttribute()]
  219. [System.Diagnostics.DebuggerStepThroughAttribute()]
  220. [System.ComponentModel.DesignerCategoryAttribute("code")]
  221. [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
  222. public abstract partial class AbstractBusines : MarshalByRefObject {
  223. }
  224.  
  225. /// <remarks/>
  226. [System.Xml.Serialization.XmlIncludeAttribute(typeof(AbstractBusines))]
  227. [System.Xml.Serialization.XmlIncludeAttribute(typeof(AbstractEntity))]
  228. [System.Xml.Serialization.XmlIncludeAttribute(typeof(Book))]
  229. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  230. [System.SerializableAttribute()]
  231. [System.Diagnostics.DebuggerStepThroughAttribute()]
  232. [System.ComponentModel.DesignerCategoryAttribute("code")]
  233. [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
  234. public abstract partial class MarshalByRefObject {
  235. }
  236.  
  237. /// <remarks/>
  238. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  239. public delegate void SaveBookCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
  240.  
  241. /// <remarks/>
  242. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  243. public delegate void SearchBookCompletedEventHandler(object sender, SearchBookCompletedEventArgs e);
  244.  
  245. /// <remarks/>
  246. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
  247. [System.Diagnostics.DebuggerStepThroughAttribute()]
  248. [System.ComponentModel.DesignerCategoryAttribute("code")]
  249. public partial class SearchBookCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
  250.  
  251. private object[] results;
  252.  
  253. internal SearchBookCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
  254. base(exception, cancelled, userState) {
  255. this.results = results;
  256. }
  257.  
  258. /// <remarks/>
  259. public System.Data.DataTable Result {
  260. get {
  261. this.RaiseExceptionIfNecessary();
  262. return ((System.Data.DataTable)(this.results[]));
  263. }
  264. }
  265. }

二十、【.Net开源】EFW框架核心类库之WebService服务的更多相关文章

  1. 十九、【.Net开源】EFW框架核心类库之WCF控制器

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.1:http://pan.baidu.com/s/1qWJjo3U EFW框架实例源代码下载:http://pan.baid ...

  2. 二十九、EFW框架开发的系统支持SaaS模式和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  3. 十五、EnterpriseFrameWork框架核心类库之系统启动入口与初始化

    本章内容是讲三种开发模式,web模式.Winform模式和Wcf模式的系统启动入口有什么区别,以及启动后系统初始化的内容:为什么要把这些单独提出来讲一章,因为我觉得本章非常重要,我们都知道程序中的ma ...

  4. 十四、EnterpriseFrameWork框架核心类库之简易ORM

    在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,D ...

  5. 【开源EFW框架】框架中自定义控件GridBoxCard使用实例说明

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  6. 第三百二十节,Django框架,生成二维码

    第三百二十节,Django框架,生成二维码 用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qr ...

  7. 十八、【开源】EnterpriseFrameWork框架核心类库之Winform控制器

    回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U EFW框架中的WinContro ...

  8. 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO

    回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...

  9. 十二、EnterpriseFrameWork框架核心类库之与EntLib结合

    从本章开始对框架的讲叙开始进入核心类库的讲解,前面都是对框架外在功能讲解,让人有个整体的概念,知道包含哪些功能与对系统开发有什么帮助.以后多章都是讲解核心类库的,讲解的方式基本按照代码的目录结构,这样 ...

随机推荐

  1. 使用Lucene.NET实现数据检索功能

    引言     在软件系统中查询数据是再平常不过的事情了,那当数据量非常大,数据存储的媒介不是数据库,或者检索方式要求更为灵活的时候,我们该如何实现数据的检索呢?为数据建立索引吧,利用索引技术可以更灵活 ...

  2. Mac OS X 系统下自带的文本文件格式转换工具iconv

    1. utf-8 转 GBK的方法 在mac bash 中直接运行 iconv -f UTF-8 -t GBK test_utf8.txt > test_gbk.txt 举例:创建测试文件 ec ...

  3. 套路!从Ruby 到 Cocoapods的发布

    前言: 现在的社会讲究的是套路,作为一名iOS工程师, 一言不合我要发套路了! 一.Ruby(ruby环境已经安装了的朋友可以跳过这一点) 准备: Mac OSX 安装xcode,它会帮你安装好 Un ...

  4. ftp如何预览图片 解决方案

    下载使用 server-U ,开启 HTTP 服务,输入 http://ip:端口 后,登录ftp账号密码,可选使用 基于java的应用 web client 或 FTP Voyager JV,来预览 ...

  5. pip 豆瓣镜像使用

    pip install -i https://pypi.douban.com/simple/ flask 要用https的 https://pip.pypa.io/en/latest/user_gui ...

  6. ECShop出现Strict Standards: Only variables should be passed by reference in的解决方法

    今天安装ecshop的时候最上面出现了一个错误提示:Strict Standards: Only variables should be passed by reference in F:\www.x ...

  7. 集群: 如何在spring 任务中 获得集群中的一个web 容器的端口号?

    系统是两台机器, 跑四个 web 容器, 每台机器两个容器 . nginx+memcached+quartz集群,web容器为 tomcat . web 应用中 用到spring 跑多个任务,任务只能 ...

  8. S7-200系列PLC与WINCC以太网通信CP243i的实例

    S7-200系列PLC与WINCC以太网通信CP243i的实例 ----选用大连德嘉国际电子www.dl-winbest.cn的CP243i作为连接S7-200的PPI口转以太网RJ45的接口转换器. ...

  9. 原创:goldengate从11.2升级到12.1.2

    goldengate从11.2升级到12.1.2 1.停止抽取进程 GGSCI (001.oracle.drs.dc.com) 286> stop EXTSJ01 2. 停止投递和复制进程 等待 ...

  10. LCLFramework框架之IOC

    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...