我是WCF的新手。我在一个网站上运行了WCF服务(VacationSickPayoutService)。如果我只是声明,分配和返回一个字符串,我可以从远程网站调用WCF服务获取字符串 - 没问题。但是,如果在那个WCF服务例程中,我尝试进行数据库调用然后返回一个字符串值,它就完全失败了。我确定我需要远程调用者进行某种身份验证才能让服务调用数据库?我只是使用与物理Web用户(人类)相同的数据库登录/调用,如果他们在站点上并且进行了数据库调用。即该服务使用相同的功能。
我可以对服务机器上的web.config文件进行一些更改,以允许远程调用在服务例程中启动数据库调用吗?这是我在web.config中对WCF服务的唯一引用:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
我是否需要在web.config文件中引用实际的WCF服务(VacationSickPayoutService),或者这更复杂?
另外,忘了提到为了使用服务我在远程Web应用程序中添加了服务引用,所以我可以看到返回字符串的函数调用。
提前致谢!!!!
答案 0 :(得分:0)
从WCF服务调用数据库时,您有三种选项可供使用。您应该使用哪一个取决于您的服务部署位置。
选项3仅适用于具有域的Intranet,因为用户,服务和DB都必须知道域。选项2更常见,因为它更容易设置,通常可以为您提供相同的安全性优势。只有当您的服务和数据库都没有可用的域时,才建议使用选项1.
假设您使用选项2,则需要为您的服务创建域帐户。然后,无论您托管哪个服务,都需要使用该帐户。通常,WCF服务托管在IIS中,或者有时托管在自托管命令行应用程序中。如果您使用的是IIS,则需要将AppPool的标识设置为您为该服务创建的域帐户。最后,您需要为您的域帐户提供数据库中的必要访问权限(例如,在SQL Server中,您需要为该帐户创建服务器和数据库登录,然后授予其表读访问权限等)。
当我开始使用WCF时,我正在对错误进行大量盲目调试,写入日志文件等。然后我找到了这个工具:Service Trace Viewer Tool (MSDN)。这是分析WCF服务出错的最佳方式;它将捕获发生的所有,并让您搜索例如您的数据访问代码所引发的异常。
您可能还希望在调试时设置includeExceptionDetailInFaults = true
,因为这会(通常)将详细的内部异常传递给您的客户端,以便您可以通过这种方式获得一些反馈。 (比启动服务跟踪查看器工具更容易。:))
您可以修改字符串返回服务方法,以返回字符串值Thread.CurrentPrincipal.Identity.Name
,以查看运行该服务的帐户。 (MSDN documentation)