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,两者不一样,你代码里没有设置终结点的相对地址,但配置文件里设置了相对地址,所以最终的终结点地址一样。