这几天一直在部署导师的一个项目,说说下自己实地现场部署的经验吧
首先,必须明白你自己的软件和他们软件的接口是什么
第二,必须明白实地操作环境是怎么样的,你必须自己携带什么样的工具
第三,必须在自己这边实际测试多遍,对实际情况的任何猜想和模拟都必须测试过,才能最快效率的在客户那边部署
讲多了,先说下自己的开发感受吧,整个项目前台网站是用linux作为web服务器的,中间的自主系统提供webservice和第一级数据库,部署windows 2003 R2双网卡系统 一端接前台,一端接数据中心,最后的数据中心是客户的数据中心,只是简单的开了webservice对接口。事实证明,webservice 服务可以穿透双网卡,不必在服务器上做路由重定向或者静态路由
项目开始采用的是网络上普遍使用的 动态生成webservice
代码如下
///<summary>
///动态Web服务代理方法
///</summary>
///<param name="@namespace">传入空间命名</param>
///<param name="url">传入URL参数</param>
///<param name="classname">传入类名</param>
///<param name="methodname">传入方法名</param>
///<param name="args">传入参数,本参数为顺序参数</param>
public object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)
{
try
{
System.Net.WebClient wc = new System.Net.WebClient();
System.IO.Stream stream = wc.OpenRead(url + "?WSDL");
System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);
System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
后来看了网络一些牛人关于静态和动态的效率之差,震惊之下,改项目为所有静态,通过更换url来改变服务引用
动态和静态的差别在于,动态每次引用都生成一次代理对象,效率低下,可以为未知服务提供接口,建立新契约
静态生成一次对象后就不再生成,效率高,只是通过改变对象的url指向来改变服务提供商,契约固定,无法随意更改契约内容
个人设想 能否以静态类形式保存对象存在,以动态形式修改契约的内容和服务提供商URL。这样的话,是否兼顾了静态的高效和动态的高可用?
有知道或者做过类似实验的朋友么?