【MSH】如何开发第一个最简单的WCF模块服务(附实例源码)
还不知道什么MSH的朋友请看开篇文章: 【MSH】一个轻量级但很实用的WCF模块服务框架+WCF模块服务托管程序MSH[开篇]
Module Service Hosting(MSH),是一个WCF服务模块托管程序,它提供了常用功能来管理自定义的模块服务,有了它,你可以快速开发和部署自己的WCF服务,使各个应用程序之间的沟通更方便。
在开篇文章里不少朋友说看不懂或不知道用它来干什么的,其实它就是一个搭好了的轻量型框架,方便大家快速有效的开发WCF服务、部署WCF服务、使客户端和服务器端安全、灵活交互等等。或许是目前使用WCF的人还很少吧,还在使用Web Service。好了,进入正题:
下载MSH1.0 (for .net 3.5)
下载最简单的MshDemo (for vs2010 & .net 3.5)
请先看实例的项目结构:
1. MSH 目录下存放MSH主程序,改名为My.MSH.exe,配置相应也改为My.MSH.exe.config;
2. MyModule 项目是WCF模块,引用MSH目录下的程序集 KudySharp.dll,在项目属性选择输出到 MSH\Modules 目录下。
2. MSH.Client 项目是客户端winform测试项目,引用MyModule项目和MSH目录下的程序集 KudySharp.dll。
下面开始讲如何完成下面的项目:
提示:本人vs2010,而且使用.net3.5
一、新建解决方案 MshDemo
二、新建类库项目 MyModule ,选中项目右键打开项目属性,把默认命名空间改为 My.Msh,引用MSH目录下的程序集 KudySharp.dll ,最后在项目属性选择输出到 MSH\Modules 目录下。
1.定义通道上下文 MyChannelContext
/// <summary> /// 定义通道上下文,必须是继承 ChannelContextBase<TContext> /// </summary> [Serializable] // 类和属性都必须是可序列化的 public class MyChannelContext : ChannelContextBase<MyChannelContext> { /// <summary> /// 自定义属性 /// </summary> public string AppName { get ; set ; } } |
2.定义WCF服务接口 IMyService
/// <summary> /// 服务接口 /// </summary> [ServiceContract] public interface IMyService { [OperationContract] DateTime GetTime(); [OperationContract] string GetString( string str); } |
3.实现WCF服务接口 MyService
/// <summary> /// 服务实现 /// </summary> public class MyService : IMyService { public DateTime GetTime() { return DateTime.Now; } public string GetString( string input) { var context = MyChannelContext.Current; string ret = "input:" + input; ret += "\r\nAppName:" + context.AppName; ret += "\r\nAppName2:" + context[ "AppName2" ]; // 返回信息给客户端,当然也可以是你自己定义的其它属性 context.ReturnMessage = "OK" ; return ret; } } |
4.最后定义模块服务类 TestModule
/// <summary> /// 自己定义模块,必须是继承 ModuleBase<TContext, TContract, TService> /// </summary> public sealed class TestModule : ModuleBase<MyChannelContext /*使用的通道上下文*/ , IMyService /*WCF接口约束*/ , MyService /*WCF接口实现*/ > { // 此例子使用了框架里默认的模块主机,所以不需要重写令牌 /// <summary> /// 模块服务名称 /// </summary> public override string ServiceName { get { return "MyService" ; } } /// <summary> /// 模块服务描述 /// </summary> public override string ServiceDescription { get { return "this is my first module service" ; } } } |
到这里,模块项目开发完了, 点击生成后,可以在 MSH\Modules 目录下看到 MyModule.dll。
二、下面接着写客户端测试程序,新建 MSH.Client 项目,引用 MyModule 项目和 MSH 目录下的程序集 KudySharp.dll。
下面是调用上面WCF接口的测试代码:
private void btnGetTime_Click( object sender, EventArgs e) { try { DateTime result = ModuleClient.CreateChannel<TestModule, IMyService, DateTime>(server, port, proxy => { return proxy.GetTime(); }); MessageBox.Show( "Time:" + result.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnGetString_Click( object sender, EventArgs e) { try { string result = ModuleClient.CreateChannel<TestModule, IMyService, string >(server, port, proxy => { // 通道上下文必须是在这个action里面设置属性,外面无效 var context = MyChannelContext.Current; context.AppName = "MSH client" ; context[ "AppName2" ] = "MSH client2" ; return proxy.GetString( "i am kudy" ); }); MessageBox.Show(result + "\r\n\r\nReturnMessage:" + MyChannelContext.Current.ReturnMessage); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
最后,运行MSH.Client项目,显示了如下界面:
点击 Run MSH 运行MSH主程序,可以看到被托管的模块服务MyModule
然后再分别点击按钮测试那两个接口的返回结果:
OK,测试完成了~
出处:http://kudy.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡