gpt4 book ai didi

c# - WCF 和 EF - 如何强制主机使用自己的连接字符串

转载 作者:太空狗 更新时间:2023-10-29 23:32:49 27 4
gpt4 key购买 nike

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

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

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

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

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

由于 WCF 主机正在与数据库而不是直接与客户端对话,所以我不明白为什么客户端需要连接字符串。我只能猜测连接字符串正在从客户端向上传递到 WCF 主机再到 Entity Framework。我怎样才能让 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>

来自 Entity Framework 项目中的 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();
}
}
}

谢谢, 乔

最佳答案

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

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

Service1 MyService = new Service1();

如果是这样,只需删除对服务项目的引用和Add Service Reference反而。这将生成一个代理,您可以使用它来访问您的服务。

关于c# - WCF 和 EF - 如何强制主机使用自己的连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14065573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com