首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WCF,请看下配置服务,该如何处理

2014-01-25 
WCF,请看下配置服务一个WCF服务,使用控制台应用程序承载服务。下面这段使用代码配置服务: class Program{st

WCF,请看下配置服务
一个WCF服务,使用控制台应用程序承载服务。
下面这段使用代码配置服务:


 class Program
    {
        static void Main(string[] args)
        {            
            Uri baseAddress = new Uri("http://localhost:8000/MyService");//①创建一个URI对象,用来保存服务的基址(监听地址)
            ServiceHost selfHost = new ServiceHost(typeof(MyService), baseAddress); //②创建一个ServiceHost对象。也就是创建服务主机
            try
            {               
                selfHost.AddServiceEndpoint(typeof(IService),new WSHttpBinding(),"MyService"); //③将服务终结点添加到承载服务中      
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();//④启用元数据交换
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb); //添加服务描述           
                selfHost.Open();//⑤启动服务
                Console.WriteLine("服务已准备就绪");
                Console.WriteLine("按下回车键以终止服务");
                Console.WriteLine();
                Console.ReadLine();               
                selfHost.Close();//关闭ServiceHostBase以关闭服务
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("异常:{0}", ce.Message);
                selfHost.Abort();
            }
        }
    }


现在,我想改成使用配置文件来配置服务,我是这样操作的L:
在承载服务的控制台程序中删除上面那些代码,只写了一句: Console.ReadKey();
然后,在控制台程序的App.config文件中这样写:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <!--配置服务和终结点-->
    <services>
      <service name="Services.MyService" behaviorConfiguration="MyBehavior">
        <host><!--配置主机-->
          <baseAddresses>
            <add baseAddress="http://localhost:8000"/>
          </baseAddresses>
        </host>
        <endpoint address="MyService" binding="wsHttpBinding" contract="Contracts.IService" bindingConfiguration="myHttpBinding">          
        </endpoint>
      </service>
    </services>
    <!--配置绑定-->
    <bindings>
      <wsHttpBinding>
        <binding name="myHttpBinding">
          <security mode="None">
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <!--配置行为-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>


    </behaviors>
  </system.serviceModel>
</configuration>



最后,重新生成,启动承载服务的控制台程序,并更新客户端的服务引用。可是就出现错误了,说:
无法连接到远程服务器(我是在本机操作的),....没有终结点在侦听...


请问,为什么报错呢,我上面的操作方法是正确的吗?
[解决办法]
ServiceHost selfHost = new ServiceHost(typeof(MyService));
if (selfHost.State != CommunicationState.Opening)
{ selfHost.Open(); }
selfHost.Opened += delegate
{
   Console.WriteLine("MyService已经启动,按任意键终止服务!");
};
Console.ReadKey(true);
selfHost.Close();
[解决办法]
必须保留这两行代码,里面的参数配置自动去读取配置文件,不用指定监听地址等信息。
ServiceHost selfHost = new ServiceHost(typeof(MyService));
selfHost.Open();//⑤启动服务
[解决办法]

客户端的代码及配置文件呢?问题应该是出在客户端。
[解决办法]
你应该访问基地址:http://localhost:8000,没有后面的MyService,<serviceMetadata?httpGetEnabled="True"/>的设置必须要有基地址的存在,就是这个道理,它通过基地址去部署的帮助页面,和你设置的那个endpoint(终结点地址)无关。
[解决办法]
另外你代码设置地址时,baseAddress(基地址)用的就是http://localhost:8000/MyService,但是配置文件里面的基地址却是http://localhost:8000,两者不一样,你代码里没有设置终结点的相对地址,但配置文件里设置了相对地址,所以最终的终结点地址一样。

热点排行