5

请原谅这个极端新手的问题。我在其他任何地方都找不到答案。

我正在使用实体框架和 WCF 编写解决方案。我将写几个不同的客户。我已将数据库连接字符串放在实体框架项目的 app.config 和 WCF 主机的 app.config 文件中。

在宿主类中,我编写了一个简单的测试服务合同,其中一个方法简单地从数据库(来自 EF)中检索所有客户,称为 GetAllCustomers()。然后我编写了一个简单的控制台客户端应用程序来调用主机的 GetAllCustomers() 并将所有客户的名字和姓氏写入控制台。

当我尝试运行客户端时,我收到一条错误消息,提示“在应用程序配置文件中找不到名为‘TRS11Entities’的连接字符串。

如果我将连接字符串复制到客户端控制台应用程序的 app.config 文件,它可以正常工作,但如果我将其注释掉,它就无法再次工作。

由于 WCF 主机正在与数据库而不是直接与客户端进行通信,因此我不明白为什么客户端需要连接字符串。我只能猜测连接字符串正在从客户端到 WCF 主机的链向上传递到实体框架。我怎样才能让 WCF 主机告诉 .NET,“责任到此为止!使用我的 app.config 的连接字符串并停止打扰客户端获取此信息!”

如果重要的话,我使用的是 Visual Studio Pro 2012,所有项目都是用 C# 编写并针对 V4.5 .NET 框架。

来自 WCF 服务项目中的 APP.CONFIG:

  <system.serviceModel>
    <services>
      <service name="OrsonServiceLibrary.Service1">
        <endpoint address="localhost" binding="basicHttpBinding" name="TRS11Entities"
          contract="OrsonServiceLibrary.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/OrsonServiceLibrary/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>
  <connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" />
  </connectionStrings>

来自实体框架项目中的 APP.CONFIG:

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey;data source=localhost'" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>

从控制台客户端应用程序中的 APP.CONFIG:

  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8000/Service1" contract="OrsonServiceLibrary.IService1" binding="basicHttpBinding" />
    </client>
  </system.serviceModel>

  <!--<connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" />
  </connectionStrings>-->

WCF 服务项目中 GetAllCustomers() 函数的代码:

public HashSet<CUSTOMER> GetAllCustomers()
{
    var db = new TRS11Entities();

    HashSet<CUSTOMER> TheCusts = new HashSet<CUSTOMER>();

    foreach (CUSTOMER c in db.CUSTOMERs)
    {
        TheCusts.Add(c);
    }

    return TheCusts;
}

控制台客户端应用程序代码:

static void Main(string[] args)
{
    Console.WriteLine("Press Enter to begin.");
    Console.ReadLine();

    Service1 MyService = new Service1();

    HashSet<CUSTOMER> cl = MyService.GetAllCustomers();

    foreach (CUSTOMER c in cl)
    {
        Console.WriteLine(c.CUSTFNAME + " " + c.CUSTLNAME);
    }

    Console.WriteLine("Press Enter to exit.");
    Console.ReadLine();
}

主机应用程序代码:

class Program
{
    static void Main(string[] args)
    {
        ServiceHost hostA = null;

        try
        {
            hostA = new ServiceHost(typeof(Service1));
            hostA.Open();

            Console.WriteLine();
            Console.WriteLine("Host started.  Press Enter to terminate host.");
            Console.ReadLine();

        }
        finally
        {
            if (hostA.State == CommunicationState.Faulted)
                hostA.Abort();
            else
                hostA.Close();
        }
    }
}

谢谢,乔

4

3 回答 3

2

有些事情告诉我,您实际上是在客户端应用程序中创建服务实例,而不是使用代理/通道。

客户端应用程序代码中的 Service1 类型是什么?是 OrsonServiceLibrary.Service1 吗?

Service1 MyService = new Service1();

如果是这样,只需删除对服务项目的引用并改为添加服务引用。这将生成一个代理,您可以使用它来访问您的服务。

于 2012-12-29T05:18:50.383 回答
1

客户端应用程序未将连接传递给您的 wcf 服务。我的猜测是您在客户端应用程序中无意中调用了您的数据库。这将解释错误以及当您将连接字符串添加到控制台应用程序时它为何起作用。

希望有帮助。发布一些代码,我们也许可以提供更多帮助。

于 2012-12-28T13:02:50.660 回答
0

如果没有代码,它会使回答您的问题变得更加困难,但是,我怀疑您的问题是您的连接字符串在库应用程序配置文件中。这里的区别在于,当您运行程序时,设置是从正在执行的程序集应用程序配置文件中加载的。

检查设置是否在“ MyApp.exe.config ”文件中。

于 2012-12-28T13:28:53.190 回答