等了好久终于等到今天!盼了好久终于把梦实现……哈哈,仅以此歌词来庆祝我为期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. 学写了一段LINQ

    要写一段代码读入一个用空格分隔的几列的文件,程序中有多处类似的文件,所以想着有没有什么好点的办法. 井名       X坐标       Y坐标         深度 测试井1  634600    ...

  2. vsphere vcenter server下安装ubuntu的vmwaretools

    0.参考文献 百度经验:这里面是以redhat桌面版为实例进行介绍的,我的环境是ubuntu-server,虽然不一样,也可以参考 http://jingyan.baidu.com/article/2 ...

  3. Android自动更新安装后显示‘完成’‘打开’按钮

    /** * 安装apk * * @param url */ private void installApk() { File apkfile = new File(apkFilePath); if ( ...

  4. oc 字符串

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  5. 【原】visual studio添加现有文件夹的方法

    由于使用版本管理器协调工作,有时同事就直接上传文件夹了,但右键添加现有项时不能添加文件夹的. 在工具栏"项目"下面有个"显示所有文件",选择这个,整个工程的文件 ...

  6. MacOs终端忽略大小写

    使用MacOs的终端时,唯一让人感觉不爽的就是Tab补全是区分大小的,所以查了资料就把这个问题搞定了.在用户目录下创建 .inputrc 文件,内容为以下三行代码,保存后重启终端再次输入文件名Tab补 ...

  7. JSPatch一些容易犯错的地方

    JSPatch一些自己使用后的发现: 1.JS不区分整数和浮点数.解析字典以后的value不需要通过 floatValue等方法转换,而是自动就转换成对应的数据类型. 2.nil在JSPatch中 不 ...

  8. 自增build ID配置

    本文转载出自:http://blog.sina.com.cn/s/blog_13ec67adc0102wimg.html   Build在plist文件中的key是“CFBundleVersion”, ...

  9. 阿里云ECS/Ubuntu Server安装Gnome图形桌面

    一.配置好Source源列表 可以参考:http://blog.csdn.net/xukai871105/article/details/24887245 另附一个比较好方便的Source源更新方法: ...

  10. 超酷的测速网站Ookla SPEEDTEST

    测试网速的工具.网站估计不少,在百度一搜都能搜出一大堆,下面介绍一个国外测试网速的网站,用户体验相当棒,感觉酷毙了,那些其它测试网速的网站跟这个比起来,简直弱毙了.这个网速测试网站就是:http:// ...