none
两个一样的WCF程序,一个却不能正常访问,请大家帮我看看。 RRS feed

  • 问题

  • 我做了两个WCF的程序,代码基本上一样的。只是方法名称和实现不一样。
    却一个能够通过IE访问元数据,而另一个却不能通过IE访问元数据。
    我检查了好半天,都没有查出为什么,急的我都快上火了。请大家帮我看看。

    第一个程序:
    契约为:
    namespace MyContract
    {
        [ServiceContract]
        public interface IHelloWCFService
        {
            [OperationContract]
            string HelloWCF(string message);
        }
    }

    服务的实现为:
    namespace MyService
    {
        public class HelloWCFService : IHelloWCFService
        {
            public string HelloWCF(string message)
            {
                return String.Format("Received message at {0} : {1}", DateTime.Now, message);
            }
        }
    }

    宿主的配置文件为:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="MyService.HelloWCFService" behaviorConfiguration="httpGetEnabled">
            <endpoint address="HelloWCF" binding="basicHttpBinding" contract="MyContract.IHelloWCFService"></endpoint>
            <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="Http://localhost:6000/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
       
        <behaviors>
          <serviceBehaviors>
            <behavior name="httpGetEnabled">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

    宿主的程序为:
    namespace HostConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {           
                using (ServiceHost host = new ServiceHost(typeof(MyService.HelloWCFService)))
                {
                    host.Opening += delegate
                    {
                        Console.WriteLine("服务已开启,正在通过地址{0}进行监听", host.BaseAddresses[0].ToString());
                    };
                    host.Open();
                    Console.ReadLine();
                }          
             }
        }
    }

    这是第一个程序,一切正常,可以通过IE浏览元数据。


    以下是第二个程序:
    契约为:
    namespace CN.LanPei.iZone.iZoneServices.iZoneContract
    {
        [ServiceContract]
        public interface ILeaveWordContract
        {
            [OperationContract]
            double AddTest(double a, double b);
        }
    }

    服务的实现:
    namespace CN.LanPei.iZone.iZoneServices.iZoneService
    {
        public class LeaveWordService : ILeaveWordContract
        {
            public double AddTest(double a, double b)
            {
                return a + b;
            }
        }
    }

    宿主配置文件为:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="CN.LanPei.iZone.iZoneServices.iZoneService.LeaveWordService" behaviorConfiguration="httpGetEnable">
            <endpoint address="LeaveWordService" binding="basicHttpBinding" contract="CN.LanPei.iZone.iZoneServices.iZoneContract.ILeaveWordContract"></endpoint>
            <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost/"/>
              </baseAddresses>
            </host>
          </service>
        </services>

        <behaviors>
          <serviceBehaviors>
            <behavior name="httpGetEnable">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

    宿主的程序为:
    namespace ConsoleAppHosting
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(CN.LanPei.iZone.iZoneServices.iZoneService.LeaveWordService)))
                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("服务已开启,正在通过地址{0}进行监听", host.BaseAddresses[0].ToString());
                    };

                    host.Open();
                }

                Console.Read();
            }
        }
    }

    以上是第二个程序,可就是不能通过IE访问元数据。



     

     

     


     做最好的自己

    2009年5月18日 9:25

答案

  • 不要客气。我能看出的错误就到这个级别了~
    很可能和IIS5有关系。我现在看不到你的代码。如果可以你能给我一份你的代码,我或许可以给你调试一下,找找原因。

    另外给你个建议吧。
    1.如果你想自己学习WCF程序开发的话。起步阶段可以先使用VS2008默认创建的WCF服务程序。一般都是可以成功运行的。IIS托管。确认项目调试成功以后,自己在尝试在原来的基础上修改配置。定义服务类等。这样的话出了问题,方便查找原因,容易解决。
    2.你可以尝试自定义宿主托管WCF服务的方式,比如Winform,Windows Service,Console等等。网上很多示例代码。这样方便学习。

       我自己写的WCF的DEMO程序,属于自定义托管宿主。Console,我的blog地址空间有下载。如果你原因也可以下载,下载连接:/Files/frank_xl/WCFServiceFrankXuLei.rar。希望能对你有点参考价值~


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

全部回复

  • 补充一下,我的系统是XP的SP3,VS是08的SP1.
    做最好的自己
    2009年5月18日 9:33
  • 帅哥  你的 xp 是不是已经开了iis服务 把 80端口占用了呢

    有效回复过700 撒花
    2009年5月18日 9:37
  • 我提个建议,其实你的基地址配置有问题:

    1.
    <add baseAddress="http://localhost/"/>没有提供可用的端口,使用系统没有使用的1024-65536之间的端口,尽量没被程序使用的。
    2. <endpoint address="LeaveWordService" binding="basicHttpBinding" contract="CN.LanPei.iZone.iZoneServices.iZoneContract.ILeaveWordContract"></endpoint>
    这个代码里终结点配置不够规范,你address="LeaveWordService","LeaveWordService"在配置文件里没有给出具体设置。

    直接原因是你的基地址端口缺省80,此端口却是已经被使用了~
    you have a dream,you gonna protect it!
    My Blog:http://www.cnblogs.com/frank_xl
    2009年5月18日 11:20
    版主
  • 我把端口设置为5000后,还是不行。没有任何ASP.NET方面的提示,IE显示“无法显示该页面”。
    做最好的自己
    2009年5月18日 12:02
  • 我改了端口还是不行。 您所说的第2条是还需要配置什么?这里不是很明白。
    做最好的自己
    2009年5月18日 12:05
  • 还想多问一句,这可能跟我的系统版本或者说是IIS版本有关吗? 因为我之前问了一些有关系统版本和WCF的问题,说是IIS5.1不完全支持WCF。
    做最好的自己
    2009年5月18日 12:08
  • 1.你这里起码要给出这个LeaveWordService的定义吧,我没记错的话。因为你<endpoint address="LeaveWordService"...使用了这个名字,它表示一个地址的名字,或者你直接把address=Http://localhost:6001/
    2.我记得你问过II5的对WCF的支持问题,但是目前来说,你有一个程序可以运行,这里仅仅调试WCF服务的话,不一定必须配置到IIS托管,太麻烦。你可以先使用VS2008运行服务,看看能不能成功再说。~
    you have a dream,you gonna protect it! My Blog:http://www.cnblogs.com/frank_xl
    2009年5月18日 12:24
    版主
  • 我试着用VS2008托管了服务,服务可以通过配置的路径访问元数据。但是调用还是出现问题。
    报告错误:
    “接收对 http://localhost:2502/Service1 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。”
    2505端口是我给程序设置的端口号。
    Service1.svc为服务部署在的文件。
    配置文件如下:














    Service1.svc文件代码如下:

    做最好的自己
    2009年5月18日 13:16
  • 1.把端口修改大点,比如10001.
    2.你能贴一下你现在的配置文件吗?我很想知道你现在服务终结点地址的配置。
    3.实在不行,估计就和你的IIS5.0有关系了,在服务托管机制上它和IIS6差别很大了。
    you have a dream,you gonna protect it! My Blog:http://www.cnblogs.com/frank_xl
    2009年5月18日 13:23
    版主
  • 我很是无奈。我贴了代码,但不显示。
     <services>
       <service name="CN.LanPei.iZone.iZoneServices.iZoneService.LeaveWordService" behaviorConfiguration="httpGet">
        <endpoint binding="wsHttpBinding" contract="CN.LanPei.iZone.iZoneServices.iZoneContract.ILeaveWordContract">
        </endpoint>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="httpGet">
         <serviceMetadata httpGetEnabled="True"/>
         <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
    做最好的自己
    2009年5月18日 13:25
  • 1.你少了终结点地址。
    2.我给你个参考代码,是基于你的例子1里修改的,关键的地方时你的服务终结点地址和基地址:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="MyService.HelloWCFService" behaviorConfiguration="httpGetEnabled">
            <endpoint address="="Http://localhost:10001/"LeaveWordService/" binding="basicHttpBinding" contract="MyContract.IHelloWCFService"></endpoint>
            <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="Http://localhost:10001/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
       
        <behaviors>
          <serviceBehaviors>
            <behavior name="httpGetEnabled">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

    you have a dream,you gonna protect it!
  • 主要是蓝色字体的代码。~


    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月18日 13:32
    版主
  • 我按你所说的修改代码如下:
      <services>
       <service name="CN.LanPei.iZone.iZoneServices.iZoneService.LeaveWordService" behaviorConfiguration="httpGet">
        <endpoint address="http://localhost:10001/LeaveWordService" binding="wsHttpBinding" contract="CN.LanPei.iZone.iZoneServices.iZoneContract.ILeaveWordContract">
        </endpoint>
            <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:10001/"/>
              </baseAddresses>
            </host>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="httpGet">
         <serviceMetadata httpGetEnabled="True"/>
         <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>

    但是报出错误:
    接收对 http://localhost:10001/LeaveWordService 的  HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。
    做最好的自己
    2009年5月18日 15:03
  • 呵呵。太感谢您这么帮忙了。这问题让我很是无奈。
    做最好的自己
    2009年5月18日 15:04
  • 不要客气。我能看出的错误就到这个级别了~
    很可能和IIS5有关系。我现在看不到你的代码。如果可以你能给我一份你的代码,我或许可以给你调试一下,找找原因。

    另外给你个建议吧。
    1.如果你想自己学习WCF程序开发的话。起步阶段可以先使用VS2008默认创建的WCF服务程序。一般都是可以成功运行的。IIS托管。确认项目调试成功以后,自己在尝试在原来的基础上修改配置。定义服务类等。这样的话出了问题,方便查找原因,容易解决。
    2.你可以尝试自定义宿主托管WCF服务的方式,比如Winform,Windows Service,Console等等。网上很多示例代码。这样方便学习。

       我自己写的WCF的DEMO程序,属于自定义托管宿主。Console,我的blog地址空间有下载。如果你原因也可以下载,下载连接:/Files/frank_xl/WCFServiceFrankXuLei.rar。希望能对你有点参考价值~


    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月18日 15:53
    版主
  • 下载了你的例子程序。你的博客我看了看。对我很有帮助,我会继续关注的。谢谢。
    做最好的自己
    2009年5月19日 2:08
  •   呵呵,有什么问题一起讨论,交流~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月19日 3:17
    版主
  • 运行了第二个,没有问题
    2009年6月1日 8:04