WCF 第五章 行为 通过配置文件暴露一个服务行为
2010-12-13 17:59 DanielWise 阅读(662) 评论(0) 编辑 收藏 举报列表5.25 实现了对在服务端配置中安装的软件授权码的一个验证行为。如果它不存在或者它不合法,服务将不会启动。它显示了服务运行时创建的用来验证配置信息的一个终结点行为。它也显示了当服务运行时创建时调用的一个行为扩展和扩展是如何将行为加入到服务运行时的。结果就是一个自定义行为在配置文件中(app.config 或者web.config)使用并被添加到服务运行时中以便于配置信息可以在服务启动时被验证。
类myServiceBehavior实现了IServiceBehavior接口。类有两个属性,_EvaluationKey和_EvaluationType.myEndpointBehavior将这些值与预定义值比较。
类myBehaviorExtensionElement 实现了IBehaviorExtensionElement接口。它定义了两个可以再配置文件中表现的[ConfigurationProperties]。它重载了BehaviorType和CreateBehavior方法以便于它可以返回同时在运行时启动时创建自定义行为myServiceBehavior。myServiceBehavior的构造函数有两个参数,每个属性一个,所以它可以执行验证操作。
列表5.25 在配置文件中暴露的终结点行为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class myServiceBehavior : IServiceBehavior { string _evaluationKey; string _evaluationType; public myServiceBehavior( string evaluationKey, string evaluationType) { _evaluationKey = evaluationKey; _evaluationType = evaluationType; } public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) { } public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) { if ((_evaluationType == "Enterprise" ) & (_evaluationKey != "SuperSecretEvaluationKey" )) { throw new Exception( string .Format( "Invalid evaludation key.Type:{0}" , _evaluationType)); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class myBehaviorExtensionElement : BehaviorExtensionElement { [ConfigurationProperty( "EvaluationKey" , DefaultValue = "" , IsRequired = true )] public string EvaluationKey { get { return ( string ) base [ "evaluationKey" ]; } set { base [ "evaluationKey" ] = value; } } [ConfigurationProperty( "EvaluationType" , DefaultValue = "Enterprise" , IsRequired = false )] public string EvaluationType { get { return ( string ) base [ "evaluationType" ]; } set { base [ "evaluationType" ] = value; } } public override Type BehaviorType { get { return typeof (myServiceBehavior); } } protected override object CreateBehavior() { return new myServiceBehavior(EvaluationKey, EvaluationType); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [ServiceContract] public interface IStockService { [OperationContract] double GetPrice( string ticker); } public class StockService : IStockService { public double GetPrice( string ticker) { if (ticker == "MSFT" ) { return 94.85; } else { return 0.0; } } } |
列表5.26 显示了服务端的配置文件。在配置文件中添加了<behaviorExtension>,指向扩展实现。注意实现是强命名的,包括它的类型名和程序集信息(名称,版本,文化和公共密钥)。在这个例子中,程序集名字和存储扩展的DLL就是服务。
列表5.26 暴露一个终结点行为的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?xml version= "1.0" encoding= "utf-8" ?> <configuration> <system.serviceModel> <behaviors /> <extensions> <behaviorExtensions> <add name= "FreeTrial" type= "Services.myBehaviorExtensionElement, Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2c0e9c165e34d972" /> </behaviorExtensions> </extensions> <services> <service name= "Services.StockService" behaviorConfiguration= "customBehavior" > <endpoint address= "" binding= "basicHttpBinding" bindingConfiguration= "" contract= "Services.IStockService" /> <host> <baseAddresses> <add baseAddress= "http://localhost:8000/EssentialWCF" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name= "customBehavior" > <FreeTrial EvaluationKey= "SuperSecretEvaluationKey" EvaluationType= "Enterprise" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> |
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述