1.我把程序修改了 不知道怎样在ws程序下重读脚本
2..NET3.5编程内容简介
3.asp.netWS支持
4.C#主è¦å¼åä»ä¹ç±»åç软件
5.WCF全面解析前 言
我把程序修改了 不知道怎样在ws程序下重读脚本
首先,动态编译实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间。
以下代码可将源码动态编译为一个程序集:
动态编译
获得assembly后,随后我们即可以通过反射获取程序集里面的类型,然后实例化,调用类型方法
不过在此之前,徒步众筹源码我们得构造WS服务的代理类,使用WCF框架,创建服务代理类,常见的代理类结构如下:
所以,我们要动态构造出代理类源码,应该知道服务的命名空间、服务方法的Action地址、ReplyAction地址,当然还有服务方法的名称,返回类型,参数列表。这里,vector扩容源码我们省略掉服务方法的参数列表,构造代理类,实际上就是一个字符串组装的问题,先创建一个类型,用于保存构造代理类所要用到的参数:
服务代理类构造参数
public class WebServiceParamaters
{
public string address;
public string Address
{
get { return address; }
set
{
address = value;
}
}
private string serviceNamespace;
public string ServiceNamespace
{
get { return serviceNamespace; }
set
{
serviceNamespace = value;
}
}
private string methodAction;
public string MethodAction
{
get { return methodAction; }
set
{
methodAction = value;
}
}
private string methodReplyAction;
public string MethodReplyAction
{
get { return methodReplyAction; }
set
{
methodReplyAction = value;
}
}
private string methodName;
public string MethodName
{
get { return methodName; }
set
{
methodName = value;
}
}
private string returnType;
public string ReturnType
{
get { return returnType; }
set
{
returnType = value;
}
}
}
好,现在我们只需要构造出代理类源码,然后动态编译出代理类的程序集,最后通过反射调用服务方法:
WebServiceProxyCreator
public class WebServiceProxyCreator
{
public Object WebServiceCaller(WebServiceParamaters parameters)
{
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters codeParameters = new CompilerParameters();
codeParameters.GenerateExecutable = false;
codeParameters.GenerateInMemory = true;
StringBuilder code = new StringBuilder();
CreateProxyCode(code, parameters);
codeParameters.ReferencedAssemblies.Add("System.dll");
codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());
Assembly assembly = null;
if (!results.Errors.HasErrors)
{
assembly = results.CompiledAssembly;
}
Type clientType = assembly.GetType("RuntimeServiceClient");
ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });
BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用
EndpointAddress address = new EndpointAddress(parameters.address);
Object client = ci.Invoke(new object[] { binding, address });
MethodInfo mi = clientType.GetMethod(parameters.MethodName);
Object result = mi.Invoke(client, null);
mi = clientType.GetMethod("Close"); //关闭代理
mi.Invoke(client, null);
return result;
}
public static void CreateProxyCode(StringBuilder code, WebServiceParamaters parameters)
{
code.AppendLine("using System;");
code.AppendLine("using System.ServiceModel;");
code.AppendLine("using System.ServiceModel.Channels;");
code.Append(@"[ServiceContract(");
if (!String.IsNullOrEmpty(parameters.ServiceNamespace))
{
code.Append("Namespace=\"").Append(parameters.ServiceNamespace).Append("\"");
}
code.AppendLine(")]");
code.AppendLine("public interface IRuntimeService");
code.AppendLine("{ ");
code.Append("[OperationContract(");
if (!String.IsNullOrEmpty(parameters.MethodAction))
{
code.Append("Action=\"").Append(parameters.MethodAction).Append("\"");
if (!String.IsNullOrEmpty(parameters.MethodReplyAction))
{
code.Append(", ");
}
}
if (!String.IsNullOrEmpty(parameters.MethodReplyAction))
{
code.Append("ReplyAction=\"").Append(parameters.MethodReplyAction).Append("\"");
}
code.AppendLine(")]");
code.Append(parameters.ReturnType).Append(" ");
code.Append(parameters.MethodName).AppendLine("();");
code.AppendLine("}");
code.AppendLine();
code.AppendLine("public class RuntimeServiceClient : ClientBase<IRuntimeService>, IRuntimeService");
code.AppendLine("{ ");
code.AppendLine("public RuntimeServiceClient(Binding binding, EndpointAddress address) :base(binding, address)");
code.AppendLine("{ ");
code.AppendLine("}");
code.Append("public ").Append(parameters.ReturnType).Append(" ");
code.Append(parameters.MethodName).AppendLine("()");
code.AppendLine("{ ");
code.Append("return base.Channel.").Append(parameters.MethodName).AppendLine("();");
code.AppendLine("}");
code.AppendLine("}");
}
}
注意,由于代理类使用了WCF框架,所以编译时我们需要添加System.ServiceModel的引用,当然System.dll肯定是必须的,这里要注意,System.ServiceModel.dll应该保存到应用程序目录,否则动态编译时会引发异常,很简单,在工程引用中添加System.ServiceModel的引用,然后在属性中将拷贝到本地属性设置为true。捷径库源码
到此,我们就可以直接通过传入的服务地址、服务方法名称以及相关的命名空间,即可调用服务(尽管我们只能调用无参服务,并且尽管我们也只能调用使用BasicHttpBinding绑定的服务,这些限制的原因是…我懒,好吧,相信只要经过一点改动即可去掉这些限制)。
可惜,我们的程序还很傻:每次调用服务都需要去生成代码、编译、创建代理实例最后再调用,嗯…那就缓存吧:
在WebServiceParameters类中重写GetHashCode方法:
然后在WebServiceProxyCreator中加入缓存机制:
public class WebServiceProxyCreator
{
private static Dictionary<int, Type> proxyTypeCatch = new Dictionary<int, Type>();
public Object WebServiceCaller(WebServiceParamaters parameters)
{
int key = parameters.GetHashCode();
Type clientType = null;
if (proxyTypeCatch.ContainsKey(key))
{
clientType = proxyTypeCatch[key];
Debug.WriteLine("使用缓存");
}
else
{
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters codeParameters = new CompilerParameters();
codeParameters.GenerateExecutable = false;
codeParameters.GenerateInMemory = true;
StringBuilder code = new StringBuilder();
CreateProxyCode(code, parameters);
codeParameters.ReferencedAssemblies.Add("System.dll");
codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());
Assembly assembly = null;
if (!results.Errors.HasErrors)
{
assembly = results.CompiledAssembly;
}
clientType = assembly.GetType("RuntimeServiceClient");
proxyTypeCatch.Add(key, clientType);
}
ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });
BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用
EndpointAddress address = new EndpointAddress(parameters.address);
Object client = ci.Invoke(new object[] { binding, address });
MethodInfo mi = clientType.GetMethod(parameters.MethodName);
Object result = mi.Invoke(client, null);
mi = clientType.GetMethod("Close"); //关闭代理
mi.Invoke(client, null);
return result;
}
}
.NET3.5编程内容简介
《.NET3.5编程》是一本详尽的指南,涵盖了多项关键技术和框架,以提升应用程序开发的效率和质量。 首先,WPF(Windows Presentation Foundation,pc驱动源码窗口表示基础)被引入,它结合了表示框架和图形子系统,使得开发人员能够轻松实现类似Vista的绚丽用户界面,为应用程序带来现代化的视觉体验。 接着,WCF(Windows Communication Foundation,Windows通信基础)作为基础,为开发者提供了标准的网络通信解决方案,使得应用程序可以无缝地跨越网络边界进行交互。 WF(Windows Workflow Foundation,Windows工作流基础)则帮助开发者定义、执行和管理复杂的工作流,提升业务流程的自动化和灵活性。 Windows CardSpace,作为一种新的身份管理技术,被用来有效地组织和保护用户的个人信息,强化了安全性。青龙西游源码 XAML,作为Microsoft的基于XML的标记语言,与WPF紧密集成,使得用户界面设计变得更为直观和高效。 此外,Ajax(Asynchronous JavaScript and XML)技术,作为ASP.NET的扩展,允许开发者在客户端实现异步操作,增强了用户体验并提升了网页的交互性能。 总体来说,.NET3.5为.NET Framework增添了新的功能和特性,使得开发者能够更轻松地构建出可扩展、可靠的企业级应用程序,极大地提高了开发效率和应用的现代化水平。扩展资料
《NET3.5编程》演示了Microsoft的新框架如何极大地改进了Windows和Web应用程序的编程能力,并且说明了多种不同的技术如何通过架构模式和工具包含了NET3.5汇聚的最佳实践。在《NET3.5编程》中,作者JesseLiberty和AlexHorovitz描述了怎样结合使用4种主要的技术来构建现代的n层和面向服务的应用程序。每个示例都是用C#编写的,并且可以下载源代码。asp.netWS支持
ASP.NET从1.0版本开始支持Web Service的开发,这是微软在本地平台上支持Web Service发展的一个重要实现。虽然ASP.NET并不是微软的第一个Web Service开发工具,但其提供的WSDL.exe工具能够连接Web Service并下载WSDL定义档,进而自动生成供客户端应用程序使用的Proxy Class源代码。在Visual Studio开发环境中,这一过程则由“加入Web参考”的操作自动处理。 ASP.NET Web Service的发展是平台基础的一部分,微软在Web Service开发领域持续提供支持。特别是随着WS-I(Web Service Interoperability)组织的成立,微软开发了Web Service Enhancement(WSE)增强包,以符合WS-I的Web Service标准。最新版本为3.0(与ASP.NET 2.0配合使用),支持许多WS-I标准。 随着Windows Communication Foundation(WCF)的推出,微软将Web Service的发展重心转移到了WCF上。因此,原来的ASP.NET Web Service被赋予了新的名称:ASMX Web Service。扩展资料
ASP 是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术。 指 Active Server Pages(动态服务器页面) ,运行于 IIS 之中的程序 。C#主è¦å¼åä»ä¹ç±»åç软件
å¯ä»¥å¼å以ä¸ç±»åçç¨åºï¼1ãWindowsæ¡é¢åºç¨ç¨åºï¼ç¨.Netæä¾çWPF模åå¾ä¾¿æ·çå°±è½çææ¡é¢åºç¨ã
2ãWindows Storeåºç¨ç¨åºï¼è¿æ¯Win8以ä¸ç³»ç»é对触æ¸å±åºç设计ï¼éå¸¸å ¨å±è¿è¡çã
3ãWebåºç¨ç¨åºï¼éè¿webFormså建çASP.NETåºç¨ç¨åºã
4ãWCFæå¡ï¼æ¯è¾é«çº§ï¼æ¯ä¸ç§çµæ´»å建åç§åå¸å¼åºç¨ç¨åºçæ¹å¼ï¼å¯éè¿å±åç½æäºèç½äº¤äºå ä¹åç§æ°æ®ã
æ©å±èµæ
ç¨åºæ§è¡
C#æå¼åçç¨åºæºä»£ç 并ä¸æ¯ç¼è¯æè½å¤ç´æ¥å¨æä½ç³»ç»ä¸æ§è¡çäºè¿å¶æ¬å°ä»£ç ãä¸Java类似ï¼å®è¢«ç¼è¯æ为ä¸é´ä»£ç ï¼ç¶åéè¿.NETFrameworkçèææºââ被称ä¹ä¸ºéç¨è¯è¨è¿è¡åºï¼CLRï¼ââæ§è¡ã
ææç.Netç¼ç¨è¯è¨é½è¢«ç¼è¯æè¿ç§è¢«ç§°ä¸ºMSILï¼Microsoft Intermediate Language ï¼çä¸é´ä»£ç ãå æ¤è½ç¶æç»çç¨åºå¨è¡¨é¢ä¸ä»ç¶ä¸ä¼ ç»æä¹ä¸çå¯æ§è¡æ件é½å ·æâ.exeâçåç¼åãä½æ¯å®é ä¸ï¼å¦æ计ç®æºä¸æ²¡æå®è£ .Net Frameworkï¼é£ä¹è¿äºç¨åºå°ä¸è½å¤è¢«æ§è¡ã
å¨ç¨åºæ§è¡æ¶ï¼.Net Frameworkå°ä¸é´ä»£ç ç¿»è¯æ为äºè¿å¶æºå¨ç ï¼ä»è使å®å¾å°æ£ç¡®çè¿è¡ãæç»çäºè¿å¶ä»£ç 被åå¨å¨ä¸ä¸ªç¼å²åºä¸ãæ以ä¸æ¦ç¨åºä½¿ç¨äºç¸åç代ç ï¼é£ä¹å°ä¼è°ç¨ç¼å²åºä¸ççæ¬ãè¿æ ·å¦æä¸ä¸ª.Netç¨åºç¬¬äºæ¬¡è¢«è¿è¡ï¼é£ä¹è¿ç§ç¿»è¯ä¸éè¦è¿è¡ç¬¬äºæ¬¡ï¼é度ææ¾å å¿«ã
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-c#
WCF全面解析前 言
在开始深入探讨《WCF全面解析》之前,让我们先理解其创作背景。董作宾的《殷历谱》创作历程艰辛,同样,《WCF全面解析》的编写也面临着深度剖析技术、缺乏现成资料的挑战。作者蒋金楠花费大量时间在源码分析上,涉及众多WS-*规范,特别是对MSDTC、TCP等基础知识的讲解,使得整个写作过程充满挑战,读者的期待成为了推动作者坚持的动力。
《WCF全面解析》分为上下两册,以帮助读者构建高性能应用为宗旨。书中注重原理和实践并重,讲解了%时间用于主体构建,%精力用于核心内容和bug修复。内容覆盖广泛,从WCF的介绍、地址和绑定,到服务契约、序列化、消息等多方面深入解析。
对于C#和.NET Framework有一定了解的读者,可以从第1章的契约编程和编码解码开始,了解WCF的历史背景和编程模型。第7章深入解析服务寄宿,而第8章则探讨客户端操作的细化。第章介绍了REST服务,以及第章的实例研究,如电子商务网站。
下册中,第1章和第2章涉及异常处理和元数据,第3章讲解事务处理,第4章则关注并发与限流。第章的实践应用部分,包含电子商务网站的详细架构和扩展。第6章至第章分别讨论了可靠会话、队列服务、传输安全、授权与审核以及WCF 4.0新特性等。
特别鸣谢张春雨、周筠等编辑和审稿人,以及作者的家人和研究团队。本书基于源代码分析、实践验证和经验总结,欢迎读者反馈任何发现的偏差。书中附有个实例,详细标注在章节标题中,源代码可在相关链接下载。