• WCF入门(22)


    前言

    本还想写一集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其实也可以移除,代码中也可以配置,不过暂时先放着吧。

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

    QQ截图20151117090308

    由图可知该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:

    QQ截图20151117092354

    测试调用:

    QQ截图20151117092508

    works fine。

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

    Thank you!

  • 相关阅读:
    lintcode 中等题:interleaving String 交叉字符串
    lintcode 中等题:subsets II 带重复元素的子集
    lintcode 中等题:subSets 子集
    单机安装HBase
    编写运行R脚本
    R语言归一化处理
    HBase 常用Shell命令
    HBase基础知识
    Tomcat启动脚本
    Nginx配置文件详解
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4970720.html
Copyright © 2020-2023  润新知