0

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

InvalidOperationException 在 ServiceModel 客户端配置部分中找不到引用合同“ServiceReference.IServiceLibrary”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素

问题出在哪里?

客户端配置

<?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>
4

2 回答 2

0

我的第一个想法是你没有将服务库的<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>
于 2016-09-21T19:18:40.363 回答
0

您的客户端需要一个包含服务端点的 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>
于 2016-09-21T18:40:00.803 回答