我的wcf客户端显示异常,但WcfTestClient Tool工作正常

问题描述 投票:0回答:1

我用netTcpBinding编写了一个WCF服务器端。然后我编写了一个客户端。但它在执行“var sc = new CommondServiceClient();”时显示异常。在运行时。我该怎么办?

以下是异常消息:

System.InvalidOperationException HResult = 0x80131509 Message =无法在ServiceModel客户端配置部分中找到引用合同“ICommondService”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。 Source = System.ServiceModel StackTrace:......

我尝试过一些东西:

  1. 我可以使用WcfTestClient来使用服务。
  2. 服务引用由visual studio“添加服务引用...”添加。我想我得到服务mex数据。但我遇到了上面的运行时异常
  3. 我也尝试使用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();
            }

我不知道出了什么问题。我应该要求什么文件?你能帮助我吗?

c# .net wcf
1个回答
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如果有任何我可以提供的帮助,请随时告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.