当前位置:编程学习 > C#/ASP.NET >>

wcf 目标机器积极拒绝问题

  各位大佬好,小弟初学WCF, 还没入门,还请大家多多指教,在客户端引用服务端是提示如下错误:
   下载“http://127.0.0.1:9999/addservice/_vti_bin/ListData.svc/$metadata”时出错。
无法连接到远程服务器
由于目标计算机积极拒绝,无法连接。 127.0.0.1:9999
元数据包含无法解析的引用:“http://127.0.0.1:9999/addservice”。
没有终结点在侦听可以接受消息的 http://127.0.0.1:9999/addservice。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参见 InnerException 以了解详细信息。
无法连接到远程服务器
由于目标计算机积极拒绝,无法连接。 127.0.0.1:9999
如果该服务已在当前解决方案中定义,请尝试生成该解决方案,然后再次添加服务引用。

  防火墙关闭状态,服务正常开启,通过 http://127.0.0.1:9999/addservice?wsdl 在浏览器中无法访问元数据。

  服务端配置文件:
     <system.serviceModel>
    <services>
      <service name="AddService.MyAdd" behaviorConfiguration="addBehavior">
        <endpoint address="http://127.0.0.1:9999/addservice" binding="wsHttpBinding" contract="AddContract.IAdd"></endpoint> 
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="addBehavior">
          <serviceMetadata httpGetUrl="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

  WinForm 宿主 :
  
        private void button1_Click(object sender, EventArgs e)
        {
            using (ServiceHost host = new ServiceHost(typeof(AddService.MyAdd)))
            {
                host.Opened += delegate { MessageBox.Show(string.Format("服务正常开启:{0}",host.State.ToString())); };
                host.Open();
            }
        }
      --------------------编程问答-------------------- <system.serviceModel>
<Binding>

</Binding>
</system.serviceModel>


这一节里面你没有绑定设置.现在你用的是wsHttpBinding,没看到设置在哪里? --------------------编程问答-------------------- WCF的配置文件共分为两部分:服务端配置与客户端配置。两者由于功能的不同,在配置文件的使用上也略有不同。

1.WCF的服务端配置

服务端的配置文件主要包括endpoint、binding、behavior的配置。一个标准的服务端配置文件所包含的主要xml配置节如下所示:
<system.ServiceModel>

   <services>
      <service>
         <endpoint/>
      </service>
   </services>

   <bindings>
   <!—定义一个或多个系统提供的binding元素,例如<basicHttpBinding> --> 
   <!—也可以是自定义的binding元素,如<customBinding>. -->
      <binding>
      <!—例如<BasicHttpBinding>元素. -->
      </binding>
   </bindings>

   <behaviors>
   <!—一个或多个系统提供的behavior元素. -->
      <behavior>
      <!—例如<throttling>元素. -->
      </behavior>
   </behaviors>

</system.ServiceModel>
1.1 <services>配置节
在<services>配置节中可以定义多个服务,每一个服务都被放到<service>配置节中,WCF的宿主程序可以通过配置文件找到这些定义的服务并发布这些服务。

<service>配置节包含name和behaviorConfiguration属性。其中,name配置了实现Service Contract的类型名。类型名必须是完整地包含了命名空间和类型名。而behaviorConfiguration的配置值则与其后的<behaviors>配置节的内容有关。<endpoint>是<service>配置节的主体,其中,<endpoint>配置节包含了endpoint的三个组成部分:Address、Binding和Contract。由于具体的binding配置是在<bindings>配置节中完成,因而,在<endpoint>中配置了bindingConfiguration属性,指向具体的binding配置。如下所示:
<services>
  <service name="BruceZhang.MyService" behaviorConfiguration="MyBehavior">
    <endpoint address=""
             binding="netTcpBinding"
             bindingConfiguration="DuplexBinding"
             contract="BruceZhang.IHello" />
  </service>
</services>

我们也可以定义多个endpoint,例如:
<services>
  <service 
      name="Microsoft.ServiceModel.Samples.CalculatorService"
      behaviorConfiguration="CalculatorServiceBehavior">
    <endpoint address=""
             binding="wsHttpBinding"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
    <endpoint address="mex"
             binding="mexHttpBinding"
             contract=" Microsoft.ServiceModel.Samples.IMetadataExchange" />
  </service>
</services>

如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。例如ICalculator服务的地址就是http://localhost/servicemodelsamples/service.svc,而IMetadataExchange服务的地址则为http://localhost/servicemodelsamples/service.svc/mex。这里所谓的基地址可以在<service>中通过配置<host>来定义:
<service 
      name="Microsoft.ServiceModel.Samples.CalculatorService"
      behaviorConfiguration="CalculatorServiceBehavior">
<host>
    <baseAddresses>
        <add baseAddress=
"http://localhost/ServiceModelSamples/service.svc"/>
    </baseAddresses>
</host>
<endpoint … />
</service>

1.2 <behaviors>配置节

    当我们在定义一个实现了Service Contract的类时, binding和address信息是客户端必须知道的,否则无法调用该服务。然而,如果需要指定服务在执行方面的相关特性时,就必须定义服务的behavior。在WCF中,定义behavior就可以设置服务的运行时属性,甚至于通过自定义behavior插入一些自定义类型。例如通过指定ServiceMetadataBehavior,可以使WCF服务对外公布Metadata。配置如下:
<behaviors>
    <serviceBehaviors>
    <behavior name="metadataSupport">
      <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
    </behavior>
    <serviceBehaviors>
<behaviors>

在WCF中,behavior被定义为Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute是最常用的behavior。虽然,behavior作为Attribute可以通过编程的方式直接施加到服务上,但出于灵活性的考虑,将behavior定义到配置文件中才是最好的设计方式。
利用ServiceBehavior与OperationBehavior可以控制服务的如下属性:
1、 对象实例的生命周期;
2、 并发与异步处理;
3、 配置行为;
4、 事务行为;
5、 序列化行为;
6、 元数据转换;
7、 会话的生命周期;
8、 地址过滤以及消息头的处理;
9、 模拟(Impersonation);

例如,通过ServiceBehavior设置对象实例的生命周期:
<behaviors>
    <serviceBehaviors>
    <behavior name="metadataSupport">
      <instanceContextMode httpGetEnabled="true" httpGetUrl=""/>
    </behavior>
    <serviceBehaviors>
<behaviors>
补充:.NET技术 ,  Web Services
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,