等了好久终于等到今天!盼了好久终于把梦实现……哈哈,仅以此歌词来庆祝我为期3天的wcf学习之路圆满结束。

今天写这个文章的目的在于记录一下我自己在学习WCF的时候碰到的一些问题,俗话说,好记心不如烂笔头嘛。也为看见我这篇文章的有缘人(正在wcf中探索的人们,提供一点借鉴吧)。

还是老样子,图文并茂的文章才是好文章(我自己定义的,勿喷!)。那么接下来我将把我这一路的细节以及碰到的问题和解决方法一一展示出来。

我在学习wcf的时候第一件事就是自己做了个wcf的例子,因为wcf的传输协议有很多,比如说http、tcp。我主要讲讲tcp协议的wcf吧,因为这个确实比较麻烦的一个东西,有时候出现bug也是一些稀奇古怪的exception。废话不多说直接上图。

新建一个项目

新建好了的wcf服务库如下图

会自动生成几个类文件。这几个类文件分别是两个interface和两个interface的实现类(需要自己手动实现)。可能有的人会问,我怎么只生成了一个interface和它的实现类额?因为我想实现的是wcf通过一个servicehost和一个端口同时发布多个服务出来。另外两个是我自己新建的 。哈哈……
 
 
看看具体的代码都是啥!很简单只是声明了一个GetData(int value)函数。翻翻书或者百度一下都知道wcf的基本概念:以契约(Contract)来定义双方通信,契约必须以接口的形式体现。这里面比较重要的两个特性[ServiceContract]、[OperationContract]。一个服务契约,一个操作契约,只有定义了这两个别人才认识你是个wcf服务撒。用这个时必须引用命名空间:using System.ServiceModel;
 namespace WcfServiceLibrary
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value); } }

既然wcf叫服务那他总的有服务吧!不然怎么服务于我。别急,上代码:上面是契约、下面是服务。实际的服务代码要由契约接口派生实现。

 namespace WcfServiceLibrary
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class Service1 : IService1
{
public string GetData(int value)
{
if (value==)
{
throw new NotImplementedException();
}
return string.Format("You entered: {0}", value);
} }
}

以上工作完成后,wcf的创建算是完工了。接下来的重点,是建立wcf的宿主程序。
我就做了和控制台程序作为wcf说的宿主程序!

一般常见的是通过config文件进行配置,以为要深究的话,config文件是在有很东西要讲,而我也只是初出茅庐。所以我就一代码的形式进行配置文件的生成。而且只需要几个常用的属性就ok。且看代码

1.我先实例化绑定形式NetTcpBinding

  private static NetTcpBinding netTcpBinding = new NetTcpBinding();
public static NetTcpBinding InitNetTcpBinding()
{
netTcpBinding.Security.Mode = SecurityMode.None;
netTcpBinding.ReceiveTimeout = TimeSpan.Parse("00:10:00");
netTcpBinding.MaxBufferPoolSize = ; //
netTcpBinding.MaxBufferSize = ;
//netTcpBinding.MaxConnections = 10;
//netTcpBinding.PortSharingEnabled = true; netTcpBinding.ReaderQuotas.MaxDepth = ;
netTcpBinding.ReaderQuotas.MaxStringContentLength = ;
netTcpBinding.ReaderQuotas.MaxArrayLength = ;
netTcpBinding.ReaderQuotas.MaxBytesPerRead = ;
netTcpBinding.ReaderQuotas.MaxNameTableCharCount = ;
netTcpBinding.MaxReceivedMessageSize = ;
return netTcpBinding;
}

2.我通过反射的形式拿到wcf的契约和服务。

  public static void LoadAssemBly(string assemblyName)
{
Assembly assem = Assembly.Load(assemblyName);
Dictionary<Type, Type> svTypes = new Dictionary<Type, Type>();
List<TypeInfo> list = assem.DefinedTypes.ToList();
foreach (TypeInfo typeInfo in list)
{
if (typeInfo.Attributes.ToString().IndexOf("Abstract") >= )
{
TypeInfo tempK = typeInfo;
var result = (from t in list where t.Name==(tempK.Name.Substring()) select t).ToList();
TypeInfo tempV = result[];
svTypes.Add(tempK, tempV);
} }
string serviceAddress = string.Format("net.tcp://{0}:{1}", "localhost", "");
string endpointAddress = string.Empty;
string tName = string.Empty;
foreach (var item in svTypes)
{
tName = item.Key.Name.Substring();
endpointAddress = serviceAddress +"/"+ tName; ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress)); //加载元数据节点
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
serviceHost.Description.Behaviors.Add(smb);
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress); serviceHost.Opened += delegate
{
msg.AppendLine(string.Format("{0}开始监听 Uri 为 :{1}/mex", tName, endpointAddress.ToString()));
};
serviceHost.Open();
serviceHosts.Add(serviceHost); }

这样我们得宿主程序就完成了。运行一下看看结果

这样看来是没问题了,那么们测试一下添加服务引用是否能找到服务。如果找到了就说明确实是没问题了。

OK,搞定!看似一帆风顺。其实这中间我遇到了很多问题,下次再专门写个博客讲解吧

《转载注明出处!》

 

我的WCF摸爬滚打之路(1)的更多相关文章

  1. 我的WCF摸爬滚打之路(2)

    昨天抽空写了一个wcf的创建和宿主程序的创建文章,下面也有很多园友给了评论,在此谢谢大家给了我继续记录我的摸爬滚打之路信心……抱拳! 上次的文章<我的WCF摸爬滚打之路(1)>中写到,在测 ...

  2. 前端摸爬滚打之路(一)之 JavaScript 基础

    前言:这是我第一次在博客上记录自己的前端学习过程,以往都是在桌面右侧开个 onenote 小窗,记录自己在学习过程中获得的知识.通常都是记录的满满当当,然后心满意足的关闭窗口,但是记录不代表学会.这些 ...

  3. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  4. 学习WCF之路,长期更新

    我学习WCF之路:创建一个简单的WCF程序   为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本 ...

  5. 学习之路十四:客户端调用WCF服务的几种方法小议

    最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...

  6. 【架构之路之WCF全析(一)】--服务协定及消息模式

    上周微软开公布会说.NET支持全然跨平台和并开放Core源代码的新闻,让我们顿时感到.NET要迎来它的春天.尽管早在几年前.NET就能开发Android和IOS,可是这次的跨平台把Linux都放到了微 ...

  7. WCF配置文件与文件下载之坎坷路

    题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置.最后用控制台或者服务发布一下,不就能用了.不就是简单ABC吗?不是So Easy吗?做 ...

  8. WCF的坎坷发布之路

    背景       发布WCF服务之后,总会遇到这样活着那样的错误.再加上对IIS中的一些程序应用不太熟悉,所以解决起来比较困难.网上的解决方案特别多,但都只给出了个别一种原因.经过一个下午和一个上午的 ...

  9. 学习之路三十五:Android和WCF通信 - 大数据压缩后传输

    最近一直在优化项目的性能,就在前几天找到了一些资料,终于有方案了,那就是压缩数据. 一丶前端和后端的压缩和解压缩流程 二丶优点和缺点 优点:①字符串的压缩率能够达到70%-80%左右 ②字符串数量更少 ...

随机推荐

  1. java中判断字符串是否为数字的方法

    一: //1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); ...

  2. 我的GTD中收集的书单

    在几年的GTD过程中,收集了一些想读的书目,没有系统地整理,每当读完一本之后,就翻翻书单,寻找下一本感兴趣的书,书是不可能读完的,只能找有兴趣的.符合自己目标方向的.有些书记录了豆瓣上的评分,虽然不是 ...

  3. 迭代器 iterator(二): 用iterator遍历arraylist

           迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些 ...

  4. Reveal常用技巧(翻译来自Reveal官网blog)

    翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥 ...

  5. android network develop(1)----doing network background

    Develop network with HttpURLConnection & HttpClient. HttpURLConnection  is lightweight with Http ...

  6. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  7. C#XmlHelper操作Xml文档的帮助类

    using System.Xml; using System.Data; namespace DotNet.Utilities { /// <summary> /// Xml的操作公共类 ...

  8. APP原型设计工具,哪家强?转自知乎

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:李志超 链接:http://www.zhihu.com/question/20403141/answer/25329730 ...

  9. Redis高级应用

    上一篇博文讲述了Redis的一些常用命令,可以对数据库及数据库服务器进行操作,本篇将讲述Redis的高级应用及配置 安全性 设置密码:修改redis.conf中的requirepass,在其后面添加密 ...

  10. 工作中常用的Linux命令:目录

    工作两三年,每天都和Linux打交道,但每每使用Linux命令的时候却会像提笔忘字般不知如何使用,常常查手册或到网上找资料.此系列文章主要是为了方便自己在使用命令时随时可查阅.鄙人才疏学浅,文中若有任 ...