前言

本还想写一集WCF入门教程的,心情实在不好,明天又还有面试,改天再写吧。

说一下今天遇到的入职坑。面试能坑,上班能坑,完全没想到入职也能坑。切身经历。

今年10月份想换工作,更新了一下简历,接到北京汉克时代面试邀请,去了。后来通过了。然后谈了薪资,各方面还算稳妥。同时短信方式向对方确认了本人入职要1个月时间,是否可以。对方回答可以。于是向原公司提出离职申请。在上周5办完所有手续。期间,11月6号接到电话说会发表格给我,让我填写个人信息,后在11月13号回复了邮件,确认了各种信息。

今早去公司入职,公交还不顺,等了好久才到公司,约好时间是9点,到公司已是9点15。和hr通了电话,告知已在门口,后等了半个小时不见有人出来接待我进去。继续打电话告知说稍等有人出来。一段时间后,接到hr电话,该职位已被另一家公司给了别人。我就只能呵呵了。因为已经离职,原公司的年终奖也没有。个人损失不祥。

后hr又打电话,说推荐其他公司,暂时没有拒绝,不过,真心不舒服。。。我是不是太好说话了。

其他不想多说什么,反正这个坑,以后各位同学们长点心眼。记住这个以及这类公司。

第22集 在代码中动态配置endpoint Configure endpoint dynamically in code

通过前面的学习,有个感触,WCF的配置还是很重要的。不过,基本上能在配置文件中的实现的东西,从纯粹实现功能的角度,代码中也能配置。比如是否使用可靠的链接(reliableSession),是否包含包含异常信息(includeExceptionDetailInFaults)。但是实际项目中推荐使用配置文件的方式,因为这样不需要对代码重新编译,直接改,直接用。

但是这集要讲的是如何代码中动态配置endpoint,实际应用场景暂时不明,不过可以提供一个WCF中实现某些功能的思路。外加看完之后觉得和以前的IErrorHandler接口实现中有异曲同工之妙。还有一点要说明的是WCF中的binding扩展性还不错,学习完这集应该能有一点收获。

开始正题。

首先是endpoint的三要素,Address, Binding, Contract。因为我们要实现动态配置,所以,可以在config里面移除这些配置。

这是原先的endpoint配置。

        <endpoint address="" binding="netTcpBinding" contract="HelloService.IHelloService"></endpoint>

以及为了可以让客户端自动生成代理类,我们配置如下serviceBehavior,httpGetEnable为true。

      <serviceBehaviors>
<behavior name="myBehaviorsConfiguration">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>

现在,我们可以把这些删除。(因为includeExceptionDetailInFault可以在特性里面配置,所以也可以删除。)

然后,代码看起来就是这个样子了:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<!--<serviceBehaviors>
<behavior name="myBehaviorsConfiguration">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>-->
</behaviors>
<bindings>
<basicHttpBinding >
</basicHttpBinding>
<netTcpBinding>
<binding></binding>
</netTcpBinding>
</bindings>
<services>
<service name="HelloService.HelloService" behaviorConfiguration ="">
<!--<endpoint address="" binding="basicHttpBinding" contract="HelloService.IHelloService"></endpoint>-->
<!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />-->
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/" />
<!--<add baseAddress ="net.tcp://localhost:8734"/>-->
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

注释了两个endpoint和一个serviceBehaviors,同时移除behaviorConfiguration对上面设置的引用。baseAddress其实也可以移除,代码中也可以配置,不过暂时先放着吧。

然后,如果我们再在客户端重新添加该服务引用,会得到如下错误。

由图可知该service已无法使用。

第2步:在open host之前,我们需要手动添加个endpoint给这个host。

原先代码如下:

        static void Main(string[] args)
{
using(var host = new ServiceHost(typeof(HelloService.HelloService))) {
host.Open();
Console.WriteLine("Service Started @ " + DateTime.Now.ToString ("yyyy-MM-dd HH:mm:ss"));
Console.ReadLine();
}
}

改动后:

        static void Main(string[] args)
{
using(var host = new ServiceHost(typeof(HelloService.HelloService))) {
var serviceBehavior = new ServiceMetadataBehavior()
{
HttpGetEnabled=true
};
host.Description.Behaviors.Add(serviceBehavior);
host.AddServiceEndpoint(typeof(HelloService.IHelloService), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Service Started @ " + DateTime.Now.ToString ("yyyy-MM-dd HH:mm:ss"));
Console.ReadLine();
}
}

稍微解释一下,

1. 实例化一个serviceBehavior,这个属于System.ServiceModel.Description命名空间。

2. 把这个serviceBehavior添加到host的description的behaviors集合中。

3. 给host 添加一个endpoint,三个参数分别描述了Contract,Binding类型,Address。

然后再启动这个服务。

测试一下客户端的调用。

重新添加Reference:

测试调用:

works fine。

这集讲了动态配置endpoint,虽然暂时还没有什么实际项目经历,不过可以让我们加深一些对WCF Endpoint的理解。

Thank you!

WCF入门(22)的更多相关文章

  1. WCF入门教程(图文)VS2012

    WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...

  2. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  3. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  5. 学习WCF入门的第一个实例

    一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...

  6. WCF入门教程(五)配置文件

    WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...

  7. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  8. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  9. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

随机推荐

  1. Java基础の乱弹琴二:break关键字

    Java中的break一般用于 跳出一个switch或者循环. 跳出switch基本不用赘述. break跳出循环一般是跳出当前一层循环. 如若需要跳出多层循环可以在break后加标签,然后把标签标注 ...

  2. Java基础の第二弹 基础语法

    Java关键字 •  abstract:表明类或类中的方法是抽象的:•  boolean:基本数据类型之一,布尔类型:•  break:提前跳出一个块:•  byte:基本数据类型之一,字节类型:•  ...

  3. Web性能优化之动态合并JS/CSS文件并缓存客户端

    来源:微信公众号CodeL 在Web开发过程中,会产生很多的js/css文件,传统的引用外部文件的方式会产生多次的http请求,从而加重服务器负担且网页加载缓慢,如何在一次请求中将多个文件一次加载出来 ...

  4. UVALive 6263 The Dragon and the knights --统计,直线分平面

    题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分. 解法:计算每个骑士与每条直线的位置关系(上面还是下面) ...

  5. AC日记——手写堆ac合并果子(傻子)

    今天整理最近的考试题 发现一个东西叫做优先队列 priority_queue(说白了就是大根堆) 但是 我对堆的了解还是很少的 所以 我决定手写一个堆 于是我写了一个简单的堆 手写的堆说白了就是个二叉 ...

  6. 在3D Max中查看模型引用的贴图

    需求 假如在Max中有一个模型,想查看贴图 操作步骤 1.右上角点击 2.在弹出材质编辑器中 点击吸管 3.把吸管点击在角色模型上,然后点击M 4.点击查看图像 5.就能查看到模型使用的贴图

  7. windows组件

    Wcript.shell是windows自带的组件 因为他过于强大 所以经常被黑客加以利用 他可以调用系统内核运行的dos基本命令 与此对应的还有三个危险组件 他们分别是 FSO shell.Appl ...

  8. 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly

    [已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ...

  9. Android SQLite (二) 基本用法

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的. 一 ...

  10. sort()和qsort()方法详解

    1,C++自带的自动排序方法:sort(); 要使用此函数只需用#include <algorithm> sort即可使用. sort(begin,end),表示一个范围,例如: int ...