等了好久终于等到今天!盼了好久终于把梦实现……哈哈,仅以此歌词来庆祝我为期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. [Android]编译错误:Could not get unknown property 'release' for SigningConfig container

    使用Gradle进行安卓编译时,出现如下错误: Could not get unknown property 'release' for SigningConfig container. 原因: 在主 ...

  2. C++标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

  3. IOS GCD 浅析

     一.简单介绍 1.队列的类型:      1.1主队列:main queue 主线程队列,更新UI的操作.是一个串行的队列,串行队列每次只处理一个任务.      1.2系统创建的并发队列:glob ...

  4. Unix系统中,两个进程间的通信

    进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...

  5. Bootstrap Table使用分享

    版权声明:本文为博主原创文章,未经博主允许不得转载. 最近客户提出需求,想将原有的管理系统,做下优化,通过手机也能很好展现,想到2个方案: a方案:保留原有的页面,新设计一套适合手机的页面,当手机访问 ...

  6. JavaScript Patterns 3.5 JSON

    JSON: JavaScript Object Notation {"name": "value", "some": [1, 2, 3]}  ...

  7. SQL Server同步复制问题排查方法

    1.应用复制的命令时在订阅服务器上找不到该行 解决方法:用系统存储过程sp_browsereplcmds(返回分发数据库中存储的可读版本复制命令的结果集,并将其用作诊断工具. 此存储过程在分发服务器上 ...

  8. 【linux环境下】RabbitMq的安装和监控插件安装

    [注意安装过程中,提示某些命令not found,直接yum isntall一下就好了] 以下是我在CentOS release 6.4下亲测成功的. RabbitMq的安装:   RabbitMQ是 ...

  9. nginx 配置wordpress固定链接(自定义)

    今天在wordpress 下配置文章固定链接的时候,遇到了404的错误.我首先在wordpress下的设置里的“固定链接”配置页面,自定义链接的结构 “http://www.haozi8.com/%p ...

  10. MySQL的诡异同步问题-重复执行一条relay-log

    MySQL的诡异同步问题 近期遇到一个诡异的MySQL同步问题,经过多方分析和定位后发现居然是由于备份引发的,非常的奇葩,特此记录一下整个问题的分析和定位过程. 现象 同事扩容的一台slave死活追不 ...