我的wcf客户端显示异常,但WcfTestClient工具运行正常

时间:2019-04-24 14:36:29

标签: c# .net wcf

我已经用netTcpBinding对WCF服务器端进行了编码。然后,我为客户端编码。但是在执行“ var sc = new CommondServiceClient();”时显示异常。在运行时。我该怎么办?

以下是异常消息:

  

System.InvalidOperationException     HResult = 0x80131509     Message =在ServiceModel客户端配置部分中找不到引用合同'ICommondService'的默认终结点元素。这可能是因为找不到您的应用程序的配置文件,或者是因为在客户端元素中找不到与该协定匹配的端点元素。     源= System.ServiceModel     堆栈跟踪:    ......

我尝试了一些事情:

  1. 我可以使用WcfTestClient使用服务。
  2. 服务参考由Visual Studio“添加服务参考...”添加。我想我得到了服务混合数据。但是我遇到了上面的
  3. 这样的运行时异常
  4. 我也尝试使用svcutil工具生成代码,但仍然无法正常工作

这是wcf配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="ServiceContractor.CommondService">
        <endpoint address="" binding="netTcpBinding" contract="ServiceContractor.ICommondService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
       </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

这是自托管的wcf服务:

            var baseAddress = new Uri($"net.tcp://localhost:{PORT}/Company/service");
            _host = new ServiceHost(typeof(CommondService), baseAddress);
            try
            {
                var smb = _host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null) _host.Description.Behaviors.Add(new ServiceMetadataBehavior());
                _host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                _host.AddServiceEndpoint(typeof(ICommondService), new NetTcpBinding(), "");

                _host.Open();
            }
            catch (CommunicationException ce)
            {
                _host.Abort();
            }

我不知道怎么了。我应该索取什么文件?你能帮我吗?

1 个答案:

答案 0 :(得分:0)

  

但是我现在还有一个问题。是否有可能摆脱配置。这样应用程序只需要DLL,而对WCF服务一无所知。

通常来说,有两种方法可以在Web应用程序中调用WCF服务(Soap服务)。

  • 通过添加服务引用来生成客户端代理类,这种方式 通常需要在配置中配置服务设置 文件(web.config),大多数需要调用的服务信息是 存储在配置文件中。对于班级图书馆项目,我们有 将配置迁移到实际的配置文件 专案。
    https://docs.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client
  • 使用ChannelFactory创建通信通道,我们设置 以编程方式设置服务配置。从你的 说明,这种调用Web服务的方式可能是 适当的解决方案。定制服务配置 在代码中以编程方式进行。必须注意的是,所有 服务配置是硬编码的,例如绑定类型和服务 端点信息。您可以参考以下文档。

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-the-channelfactory 随时让我知道是否有什么可以帮助您的。