none
客户端调用服务的终结点地址的路径问题的测试(IIS托管WCF服务程序) RRS feed

  • 问题

  • 环境环境:Windows Server 2003 SP2 + Visual Studio 2008 SP1

    测试目的:对WCF中在以IIS做宿主时,什么样的地址才是客户端配置服务的终结点的正确地址?

    测试方法:
    测试1:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名且带有.svc后缀(http://127.0.0.1:7000/ServiceTest.svc
    测试结果:
    客户端程序成功运行!

    测试2:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/ServiceTest
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/ServiceTest。这通常是由于不正确的地址或者 SOAP 操作导致的。”

    测试3:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/HelloWCF
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCF。这通常是由于不正确的地址或者 SOAP 操作导致的。”


    得出结论:
    当用IIS承载宿主程序时,不能在服务的终结点地址赋值,且客户端调用该服务的终结点的地址必须使用这样的路径(宿主程序的地址+服务文件的名称(必须带.svc后缀名))才能正确调用服务中的操作。
    终结点地址的Address属性只适用于非IIS托管的场景。

    不知道得出这样的结论是不是正确?


    做最好的自己
    2009年5月22日 15:13

答案

  • 呵呵。还是个球迷。
    已经把程序发到你邮箱里了,你注意查收一下吧。
    做最好的自己
    Hi  LiPei,先附上你的测试,便于对照阅读:
    测试1:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名且带有.svc后缀(http://127.0.0.1:7000/ServiceTest.svc
    测试结果:
    客户端程序成功运行!
    测试2:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/ServiceTest
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/ServiceTest。这通常是由于不正确的地址或者 SOAP 操作导致的。”
    测试3:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/HelloWCF
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCF。这通常是由于不正确的地址或者 SOAP 操作导致的。”
    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF
    测试结果:
    (1)浏览器不能通过http://localhost:7001/http://localhost:7001/HelloWCF查看元数据
    (2)客户端程序运行失败!报出如下错误:
    “无法连接到 http://localhost:7001/HelloWCF。TCP 错误代码 10061: 由于目标机器积极拒绝,无法连接。 127.0.0.1:7001。”


       我收到了代码,调试了你的代码,并且详细看了你的说明,而且自己做了测试。首先说你的尝试不错,对IIS托管WCF服务进行了多种配置调用测试。学习态度很认真。但是限于我本地没有IIS测试环境,所以完全的测试模拟目前无法实现,但是可以就你的各个测试作分析和解答(注意我括弧里的注释都是指出错误原因和修改方法):
    测试1:
    程序配置:客户端程序成功运行!是因为此种方式为默认的WCF服务调用方式,类似于直接请求asp.net web service的asmx文件方式。测试引
    用添加生成的代码和配置文件里基本一致。测试的结果也成功。
    测试2:
    程序配置:
    (2)客户端终结点错误,修改为:http://127.0.0.1:7000/HelloWCFService)(HelloWCFService是你服务的名称。和宿主端匹配)
    测试3:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”(这个配置本身就是一个错误,HelloWCF不具备任何有效的地址含义)
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/HelloWCFService)(HelloWCF修改为HelloWCFService
    ,理由同上)。
    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”(地址错误,HelloWCF不具备任何有效的地址含义)
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF(HelloWCF修改为HelloWCFService,服务的名称,理由同上)。
       
        1.所以你后面3个测试,基本出现一样的错误信息,就是你在请求一个无效的服务,原因都是服务的地址和名称不对。
        2.至于你的结论,我查看了一下错误的解析,我们使用vs2008调试的时候是默认端口调用,基地址配置为特定端口可以成功。但是IIS托管
    的时候,要考虑具体的目录位置,才能确定服务的地址。我的理解是可以配置服务终结点地址的配置可以结合你的据以的服务发布设置目录进
    行配置。不然会出现调用无效的错误。
        3.就是你手动写客户端代码的方式,个人学习态度很好,这样可以很好的理解其通讯相关类和配置文件的设置关系。但是实际WCF服务操作
    的获取标准方式是通过元数据反序列化实现。因为现实的开发情况,服务调用和发布者不是一个机构,客户可能对服务类契约等信息一概不知
    道。曾经有的代码直接使用引用服务端dll文件的做法,这个方式同样不符合规范。
        
        以上就是对你测试的分析和总结,希望对你的这个测试有所帮助。此外我个人也从这次调试过程里收获很多,非常感谢你的帖子~ 
       另外我也把代码和回答的问题发送到你邮箱了,注意查收~
      
    Frank Xu Lei

    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月23日 15:56
    版主
  • 呵呵。首先谢谢你不厌其烦的帮助我学习WCF。

    我的机器上按你的说法做了测试。

    测试2中,我把客户端的终结点的地址改成了http://127.0.0.1:7000/HelloWCFService,但是还是不可以。

    以下的两个测试出现同样的问题。

    是不是我的环境有问题?我的是IIS6.0。

    我又测试一下:
    如果我把客户端的地址写为http://127.0.0.1:7000/HelloWCFService,那么客户端报错:
    没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCFService。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参阅 InnerException 以了解详细信息。


    但如果我把客户单的地址写为http://127.0.0.1:9285/HelloWCFService(9285为托管程序(就是那个HostWebApp项目)使用VS提供的端口,且我启动了托管的程序,以保证托管程序的运行),那么客户端报错:
    接收对 http://127.0.0.1:9285/HelloWCFService 的  HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。

    两次报出的错误不一样。

    呵呵。看你每天貌似都睡的很晚啊。注意身体。


    做最好的自己
    谢谢,不要客气~
     你的测试还是出错是吧,现在的测试1和测试2:
        你的测试1的错误还是以前一样的错误信息,还是服务地址错误。我现在不确定你测试服务是怎么运行的。是IIS托管还是VS2008临时托管运行。如果是IIS托管,你的服务地址要和你的WCF服务配置的路径有关系。一定要调用到正确的服务资源。VS2008临时托管端口都是临时分配,如果你使用客户端请求服务的话,WCF服务会被启动。

    测试1:客户端修改为http://127.0.0.1:7000/HelloWCFService,你现在可以使用浏览器浏览你发布的WCF服务吗?如果可以这个地址就是有效的。
    测试2:把客户单的地址写为http://127.0.0.1:9285/HelloWCFService。检查一下服务的配置文件终结点使用的是http绑定协议吗?还有就是VS2008临时运行WCF服务的端口是否在你机器上变化了?你可以直接启动HostWebApp.运行起来会有端口信息提示。如果变化了你要做相应的修改。

       你使用IIS托管学习WCF编程是必须的吗?还是项目要求必须这样做。如果自己学习WCF,不需要IIS部署WCF服务。过程繁琐,效率不高。而且你每次调试都要更新IIS路径文件。直接借助VS2008学习已经足够了。或者使用自定托管宿主。开发简单灵活。
      IIS托管于配置和ASPX、ASMX配置相似。个人学习,没必要选择一个繁琐的方式来学习WCF,大量的时候花在配置和调试IIS上 。而你学习的重心不在IIS如何配置.
      
       你可以再看看,有问题我们在交流,谢谢你的关心~




    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月24日 8:42
    版主
  • Hi,

    1.  你浏览服务都不成功说明服务地址或者配置有问题,IIS托管的地址和VS2008托管的地址不同。如果VS2008托管,临时分配的地址是9285的话,可以使用:http://127.0.0.1:9285/HelloWCFService.你先使用VS2008测试。但是IIS托管的时候,要考虑具体的目录位置,才能确定服务的地址.
     2.  关于托管宿主的问题,曾经有个博友Jonathan Young 在我的文章WCF分布式开发步步为赢(1):WCF分布式框架基础概念 里留言提问过。我也作了回答。托管宿主包括,IIS,控制台程序,WPF,Windows Forms,NT Service,Windows服务,COM+作为宿主。IIS部署简单,可以向发布Web Service一样部署,但是仅仅支持http协议,而且宿主进程在客户请求时候启动。IIS托管带来的弊端就是WCF有些特性入回调、单例服务、流处理、事务传播等特性无法支持。 控制台作为宿主托管简单,一般做简单WCF 编程时候使用。Windows Forms宿主可以提供管理宿主状态的UI,操作更加直观。一般企业WCF宿主会采用Windows服务或者COM+,Windows服务可以长期运行在后台,支持所有的绑定协议,但是安装部署相对复杂。COM+,作为宿主,我们可以利用COM+组建的一些特性,例如对象池等。一般企业开发选择IIS,Windows服务,性能要求的时候可以考虑COM+,作为宿主。个人学习IIS和控制台程序相对开发简单,配置便捷~
     3. 你学习确实很认真。但是WCF学习有很多误区。很多人直接奔WCF编程过去,而不关心什么场合使用WCF,为什么要用WCF。其实如果个人学习的话,应该好好的了解WCF之前的技术。只有真正的了解各个技术的优点和不足,你才能理解WCF的精髓。而不是什么情况都直接使用。我们需要根据实际情况做个判断,选择一个最适合的技术方案解决自己的问题。
     4. WCF的强大之处就是因为整合了.Net平台下所有的和分布式系统有关的Enterprise Sevices(COM+).Net Remoting、Web Service(ASMX)、WSE3.0和MSMQ消息队列等技术,我在之前的WCF分布式开发必备知识(4)WSE3.0构建Web服务安全(4)系列文章中都给出了详细的介绍,WCF学习推荐顺序是先从《WCF分布式开发必备知识》--《WSE3.0构建Web服务安全》--《WCF分布式开发步步为赢》这个是一个完整的知识体系。
           我个人也是在一直关注分布式应用相关的技术。当然WCF也不例外,关于WCF的学习,WCF相关技术都作了详细的介绍。你不介意的话可以看一下我的博客。我的个人目标也是作到Professional.有问题我们继续交流~

       
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月25日 2:48
    版主

全部回复

  •  1.IIS托管服务,并不是说必须带.svc后缀。
    我现在不清楚的客户端代码和配置文件是如何写的,我自己测试的代码是可以的,而且客户端终结点地址不是必须加.svc扩展名。

    2.你的IIS托管服务的测试,我提出几个疑问:
    a.你的客户端配置文件怎么生成?自己手写?
    b.客户端的测试代码生成还是自己手写?
    c.测试成功和测试失败的依据是什么?是调用服务操作失败,还是添加服务引用元数据失败?
    d.客户端程序运行失败!报出如下错误...等等描述,我只觉不是在运行客户端代码,是添加服务引用出的错误。
       你添加服务引用出错,和元数据交换终结点的配置很大关系,至于服务调用和服务终结点也有关系。所以上面的结论可能是对两者的概念区分不明确导致。你看完的回帖以后,继续留言,我们继续讨论,我还有一些话要说,你先回答我的问题~


    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月22日 18:54
    版主
  • 我没有采用右键添加服务引用的方式。
    客户端的配置文件和测试代码是全是自己手写的。
    测试成功与测试失败依据的是客户端能否调用服务成功,返回字符串。

    如果能够在浏览器里浏览元数据是不是可以说添加服务引用也就没有问题?

    我把我的测试程序放在了CSDN上,你若是不嫌麻烦可以下载下来帮看看我哪里有错误。
    下载地址是:http://download.csdn.net/source/1340900

    以下我列一下我的客户端代码:
    客户端的代理类是这样写的(契约和实现写在一个文件里了):
    [ServiceContract]
        public interface IHelloWCFContract
        {
            [OperationContract]
            string HelloWCF(string message);
        }

        public class ClientProxy : ClientBase<IHelloWCFContract>,IHelloWCFContract
        {
            public string HelloWCF(string message)
            {
                return this.Channel.HelloWCF(message);
            }
        }

    客户端的Program是这样写的:
        class Program
        {
            static void Main(string[] args)
            {
                ClientProxy proxy = new ClientProxy();
                string s = proxy.HelloWCF("你好,WCF");
                Console.WriteLine(s);
                Console.Read();
            }
        }

    客户端的App.Config是这样的:
    <configuration>
      <system.serviceModel>
        <client>
          <endpoint address="http://127.0.0.1:7000/ServiceTest.svc" binding="wsHttpBinding" contract="Client.IHelloWCFContract"></endpoint>
        </client>
      </system.serviceModel>
    </configuration>


    做最好的自己
    2009年5月23日 0:58
  • 对了,那个程序的文件夹里的文本文档里多了个测试4,是昨天晚上测试的,你能不能帮我看看是不是正确的。
    我也把它贴出来,让大家帮忙看看。

    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF
    测试结果:
    (1)浏览器不能通过http://localhost:7001/http://localhost:7001/HelloWCF查看元数据
    (2)客户端程序运行失败!报出如下错误:
    “无法连接到 http://localhost:7001/HelloWCF。TCP 错误代码 10061: 由于目标机器积极拒绝,无法连接。 127.0.0.1:7001。”
    做最好的自己
    2009年5月23日 1:07
  • 看你的帖子添加时间是6个半小时以前,我现在时9点半,难道你凌晨3点还没睡?
    做最好的自己
    2009年5月23日 1:32
  • 对了,那个程序的文件夹里的文本文档里多了个测试4,是昨天晚上测试的,你能不能帮我看看是不是正确的。
    我也把它贴出来,让大家帮忙看看。

    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF
    测试结果:
    (1)浏览器不能通过http://localhost:7001/http://localhost:7001/HelloWCF查看元数据
    (2)客户端程序运行失败!报出如下错误:
    “无法连接到 http://localhost:7001/HelloWCF。TCP 错误代码 10061: 由于目标机器积极拒绝,无法连接。 127.0.0.1:7001。”
    做最好的自己
    你的这个测试我也遇到过,应该是元数据的交换服务错误,导致的问题,我整理的也有这个文章,WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错 。你可以先参考一下~不是你的服务端服务终结点错误,就是你客户端端服务终结点不对。这个是很可能的原因。~

    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月23日 4:02
    版主
  • 我把我的测试程序放在了CSDN上,你若是不嫌麻烦可以下载下来帮看看我哪里有错误。
    下载地址是:http://download.csdn.net/source/1340900。。。。
     

    不好意思,我没CSDN的账户,好下载要求用户密码。你能上传到csdn,或者直接打包发我邮箱:frank_xl@163.com.~



    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月23日 4:04
    版主
  • 看你的帖子添加时间是6个半小时以前,我现在时9点半,难道你凌晨3点还没睡?
    做最好的自己

    确实~呵呵休息的晚了点,后来上来看到你的帖子,回完才就睡觉了,早上看NBA~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月23日 4:12
    版主
  • 呵呵。还是个球迷。
    已经把程序发到你邮箱里了,你注意查收一下吧。
    做最好的自己
    2009年5月23日 8:26
  • 呵呵。还是个球迷。
    已经把程序发到你邮箱里了,你注意查收一下吧。
    做最好的自己
    Hi  LiPei,先附上你的测试,便于对照阅读:
    测试1:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名且带有.svc后缀(http://127.0.0.1:7000/ServiceTest.svc
    测试结果:
    客户端程序成功运行!
    测试2:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为空
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/ServiceTest
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/ServiceTest。这通常是由于不正确的地址或者 SOAP 操作导致的。”
    测试3:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/HelloWCF
    测试结果:
    客户端程序运行失败!报出如下错误:
    “没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCF。这通常是由于不正确的地址或者 SOAP 操作导致的。”
    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF
    测试结果:
    (1)浏览器不能通过http://localhost:7001/http://localhost:7001/HelloWCF查看元数据
    (2)客户端程序运行失败!报出如下错误:
    “无法连接到 http://localhost:7001/HelloWCF。TCP 错误代码 10061: 由于目标机器积极拒绝,无法连接。 127.0.0.1:7001。”


       我收到了代码,调试了你的代码,并且详细看了你的说明,而且自己做了测试。首先说你的尝试不错,对IIS托管WCF服务进行了多种配置调用测试。学习态度很认真。但是限于我本地没有IIS测试环境,所以完全的测试模拟目前无法实现,但是可以就你的各个测试作分析和解答(注意我括弧里的注释都是指出错误原因和修改方法):
    测试1:
    程序配置:客户端程序成功运行!是因为此种方式为默认的WCF服务调用方式,类似于直接请求asp.net web service的asmx文件方式。测试引
    用添加生成的代码和配置文件里基本一致。测试的结果也成功。
    测试2:
    程序配置:
    (2)客户端终结点错误,修改为:http://127.0.0.1:7000/HelloWCFService)(HelloWCFService是你服务的名称。和宿主端匹配)
    测试3:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”(这个配置本身就是一个错误,HelloWCF不具备任何有效的地址含义)
    (2)客户端终结点地址采用宿主程序文件名但不带有.svc后缀(http://127.0.0.1:7000/HelloWCFService)(HelloWCF修改为HelloWCFService
    ,理由同上)。
    测试4:
    程序配置:
    (1)将宿主程序服务的终结点地址配置为“HelloWCF”(地址错误,HelloWCF不具备任何有效的地址含义)
    (2)将宿主程序服务的终结点配置基地址:http://localhost:7001/
    (3)客户端终结点地址为:http://localhost:7001/HelloWCF(HelloWCF修改为HelloWCFService,服务的名称,理由同上)。
       
        1.所以你后面3个测试,基本出现一样的错误信息,就是你在请求一个无效的服务,原因都是服务的地址和名称不对。
        2.至于你的结论,我查看了一下错误的解析,我们使用vs2008调试的时候是默认端口调用,基地址配置为特定端口可以成功。但是IIS托管
    的时候,要考虑具体的目录位置,才能确定服务的地址。我的理解是可以配置服务终结点地址的配置可以结合你的据以的服务发布设置目录进
    行配置。不然会出现调用无效的错误。
        3.就是你手动写客户端代码的方式,个人学习态度很好,这样可以很好的理解其通讯相关类和配置文件的设置关系。但是实际WCF服务操作
    的获取标准方式是通过元数据反序列化实现。因为现实的开发情况,服务调用和发布者不是一个机构,客户可能对服务类契约等信息一概不知
    道。曾经有的代码直接使用引用服务端dll文件的做法,这个方式同样不符合规范。
        
        以上就是对你测试的分析和总结,希望对你的这个测试有所帮助。此外我个人也从这次调试过程里收获很多,非常感谢你的帖子~ 
       另外我也把代码和回答的问题发送到你邮箱了,注意查收~
      
    Frank Xu Lei

    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月23日 15:56
    版主
  • 呵呵。首先谢谢你不厌其烦的帮助我学习WCF。

    我的机器上按你的说法做了测试。

    测试2中,我把客户端的终结点的地址改成了http://127.0.0.1:7000/HelloWCFService,但是还是不可以。

    以下的两个测试出现同样的问题。

    是不是我的环境有问题?我的是IIS6.0。

    我又测试一下:
    如果我把客户端的地址写为http://127.0.0.1:7000/HelloWCFService,那么客户端报错:
    没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCFService。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参阅 InnerException 以了解详细信息。


    但如果我把客户单的地址写为http://127.0.0.1:9285/HelloWCFService(9285为托管程序(就是那个HostWebApp项目)使用VS提供的端口,且我启动了托管的程序,以保证托管程序的运行),那么客户端报错:
    接收对 http://127.0.0.1:9285/HelloWCFService 的  HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。

    两次报出的错误不一样。

    呵呵。看你每天貌似都睡的很晚啊。注意身体。


    做最好的自己
    2009年5月24日 8:17
  • 呵呵。首先谢谢你不厌其烦的帮助我学习WCF。

    我的机器上按你的说法做了测试。

    测试2中,我把客户端的终结点的地址改成了http://127.0.0.1:7000/HelloWCFService,但是还是不可以。

    以下的两个测试出现同样的问题。

    是不是我的环境有问题?我的是IIS6.0。

    我又测试一下:
    如果我把客户端的地址写为http://127.0.0.1:7000/HelloWCFService,那么客户端报错:
    没有终结点在侦听可以接受消息的 http://127.0.0.1:7000/HelloWCFService。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参阅 InnerException 以了解详细信息。


    但如果我把客户单的地址写为http://127.0.0.1:9285/HelloWCFService(9285为托管程序(就是那个HostWebApp项目)使用VS提供的端口,且我启动了托管的程序,以保证托管程序的运行),那么客户端报错:
    接收对 http://127.0.0.1:9285/HelloWCFService 的  HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。

    两次报出的错误不一样。

    呵呵。看你每天貌似都睡的很晚啊。注意身体。


    做最好的自己
    谢谢,不要客气~
     你的测试还是出错是吧,现在的测试1和测试2:
        你的测试1的错误还是以前一样的错误信息,还是服务地址错误。我现在不确定你测试服务是怎么运行的。是IIS托管还是VS2008临时托管运行。如果是IIS托管,你的服务地址要和你的WCF服务配置的路径有关系。一定要调用到正确的服务资源。VS2008临时托管端口都是临时分配,如果你使用客户端请求服务的话,WCF服务会被启动。

    测试1:客户端修改为http://127.0.0.1:7000/HelloWCFService,你现在可以使用浏览器浏览你发布的WCF服务吗?如果可以这个地址就是有效的。
    测试2:把客户单的地址写为http://127.0.0.1:9285/HelloWCFService。检查一下服务的配置文件终结点使用的是http绑定协议吗?还有就是VS2008临时运行WCF服务的端口是否在你机器上变化了?你可以直接启动HostWebApp.运行起来会有端口信息提示。如果变化了你要做相应的修改。

       你使用IIS托管学习WCF编程是必须的吗?还是项目要求必须这样做。如果自己学习WCF,不需要IIS部署WCF服务。过程繁琐,效率不高。而且你每次调试都要更新IIS路径文件。直接借助VS2008学习已经足够了。或者使用自定托管宿主。开发简单灵活。
      IIS托管于配置和ASPX、ASMX配置相似。个人学习,没必要选择一个繁琐的方式来学习WCF,大量的时候花在配置和调试IIS上 。而你学习的重心不在IIS如何配置.
      
       你可以再看看,有问题我们在交流,谢谢你的关心~




    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月24日 8:42
    版主
  • 上次的两个测试,就是用原先的那个测试程序,把客户端的终结点地址改了一下。我就是想看看用IIS的托管和用VS的托管是不是报相同的错。没想到报的错不同。让我很是费解。
    直接使用http://127.0.0.1:7000/HelloWCFService,是浏览不了服务的。你在帖子中跟我说改成这个,我就试了试。但是不行。
    那个使9285端口的是VS托管的,我在运行时检查了端口,没问题的。

    其实我学习WCF已有半年了吧。
    我之前看过Juval Lowy的《WCF 服务编程》。
    模仿过MSDN里的个别基础的例子,也模仿过Artech的《我的WCF之旅》里的例子。
    (我之所以自己动手写客户端的代码,呵呵,也是因为模仿Artech的例子,成为习惯了吧)
    但那些都是托管程序进行托管的。
    我认为在现实中应该都是把服务放在IIS上的吧。
    而且我正在做自己的个人网站,打算用WCF来做,目的就是把这半年来的理论让自己实践一下,想想自己网站要托管在别人的服务器上,肯定服务也是要用IIS来托管的。
    所以我就想把这块搞的清楚一点。书上对这块没讲太多。


    做最好的自己
    2009年5月25日 1:43
  • Hi,

    1.  你浏览服务都不成功说明服务地址或者配置有问题,IIS托管的地址和VS2008托管的地址不同。如果VS2008托管,临时分配的地址是9285的话,可以使用:http://127.0.0.1:9285/HelloWCFService.你先使用VS2008测试。但是IIS托管的时候,要考虑具体的目录位置,才能确定服务的地址.
     2.  关于托管宿主的问题,曾经有个博友Jonathan Young 在我的文章WCF分布式开发步步为赢(1):WCF分布式框架基础概念 里留言提问过。我也作了回答。托管宿主包括,IIS,控制台程序,WPF,Windows Forms,NT Service,Windows服务,COM+作为宿主。IIS部署简单,可以向发布Web Service一样部署,但是仅仅支持http协议,而且宿主进程在客户请求时候启动。IIS托管带来的弊端就是WCF有些特性入回调、单例服务、流处理、事务传播等特性无法支持。 控制台作为宿主托管简单,一般做简单WCF 编程时候使用。Windows Forms宿主可以提供管理宿主状态的UI,操作更加直观。一般企业WCF宿主会采用Windows服务或者COM+,Windows服务可以长期运行在后台,支持所有的绑定协议,但是安装部署相对复杂。COM+,作为宿主,我们可以利用COM+组建的一些特性,例如对象池等。一般企业开发选择IIS,Windows服务,性能要求的时候可以考虑COM+,作为宿主。个人学习IIS和控制台程序相对开发简单,配置便捷~
     3. 你学习确实很认真。但是WCF学习有很多误区。很多人直接奔WCF编程过去,而不关心什么场合使用WCF,为什么要用WCF。其实如果个人学习的话,应该好好的了解WCF之前的技术。只有真正的了解各个技术的优点和不足,你才能理解WCF的精髓。而不是什么情况都直接使用。我们需要根据实际情况做个判断,选择一个最适合的技术方案解决自己的问题。
     4. WCF的强大之处就是因为整合了.Net平台下所有的和分布式系统有关的Enterprise Sevices(COM+).Net Remoting、Web Service(ASMX)、WSE3.0和MSMQ消息队列等技术,我在之前的WCF分布式开发必备知识(4)WSE3.0构建Web服务安全(4)系列文章中都给出了详细的介绍,WCF学习推荐顺序是先从《WCF分布式开发必备知识》--《WSE3.0构建Web服务安全》--《WCF分布式开发步步为赢》这个是一个完整的知识体系。
           我个人也是在一直关注分布式应用相关的技术。当然WCF也不例外,关于WCF的学习,WCF相关技术都作了详细的介绍。你不介意的话可以看一下我的博客。我的个人目标也是作到Professional.有问题我们继续交流~

       
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月25日 2:48
    版主
  • 你好,
    谢谢你的指导。我大体上看了看你的博客,的确对我很有帮助,我会继续关注你的博客的。支持你的博客,希望在以后能够在你的博客里看到更多更好的文章。可惜我现在还没有博客园的账户,等我成功申请后,收藏你的文章。
    最后,祝你尽早实现你的目标。
    做最好的自己
    2009年5月26日 2:46
  •   谢谢~我会继续努力的~有什么问题我们多交流~我也是学习~大家一起进步~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月26日 4:42
    版主