您的位置:首页 > 其它

【MSH】如何开发第一个最简单的WCF模块服务(附实例源码)

2011-11-25 15:22 806 查看
  还不知道什么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,测试完成了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: