zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4970720.html
Copyright © 2011-2022 走看看