Visual Studio InvalidOperationException 中的双工 WCF 项目

Duplex WCF Project In Visual Studio InvalidOperationException

我是 C# 的初学者,我正在尝试构建一个简单的库项目 该服务运行良好,但在客户端中总是在服务对象中抛出异常

InvalidOperationException Could not find default endpoint element that references contract 'ServiceReference.IServiceLibrary' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element

可能是哪里出了问题?

客户端配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup> 
    <supportedRuntime version="v4.0" 
                      sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IServiceLibrary" />
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint addrres="http://localhost:8733/Design_Time_Addresses/WCF/Service1/"
                binding="wsDualHttpBinding"
                bindingConfiguration="WSDualHttpBinding_IServiceLibrary"
                contract="ServiceReference.IServiceLibrary" 
                name="WSDualHttpBinding_IServiceLibrary">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

服务配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
    <add name="WCF.Properties.Settings.DemaLibraryConnectionString"
         connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\databases\DemaLibrary.mdf;Integrated Security=True;Connect Timeout=30"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <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="WCF.ServiceLibrary">
        <endpoint address="" binding="wsDualHttpBinding"
                  contract="WCF.IServiceLibrary">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCF/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
              set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- 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>

主机

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" 
                      sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <!-- 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="WCF.ServiceLibrary">
        <endpoint address="" binding="wsDualHttpBinding"
                  contract="WCF.IServiceLibrary">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCF/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

您的客户端需要一个包含您的服务端点的 app.config 文件。像这样...

app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBinding">
          <security mode="Transport" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://yourdomain.com/YourService.svc"
                binding="wsHttpBinding" bindingConfiguration="wsHttpBinding"
                contract="YourDomain.Contracts.Service.IService" />
    </client>   
  </system.serviceModel>
</configuration>

我的第一个想法是您没有将服务库的 <system.serviceModel> 部分复制到托管该服务的应用程序的配置中,但看起来您复制了。

但是,您的合同名称是错误的。您的客户端中的合同有 ServiceReference.IServiceLibrary,但服务有 WCF.IServiceLibrary。即使代码完全相同,命名空间的差异也会使它们被视为不同。

在您的客户端上,将合同名称更改为 WCF.IServiceLibrary,如下所示:

<client>
  <endpoint address="http://localhost:8733/Design_Time_Addresses/WCF/Service1/"
            binding="wsDualHttpBinding"
            bindingConfiguration="WSDualHttpBinding_IServiceLibrary"
            contract="WCF.IServiceLibrary"
            name="WSDualHttpBinding_IServiceLibrary">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>