如何在 IIS 中正确托管连接到 SQLServer 的 WCF 数据服务?为啥我会收到错误消息?

Posted

技术标签:

【中文标题】如何在 IIS 中正确托管连接到 SQLServer 的 WCF 数据服务?为啥我会收到错误消息?【英文标题】:How do I properly host a WCF Data Service that connects to SQLServer in IIS? Why am I getting errors?如何在 IIS 中正确托管连接到 SQLServer 的 WCF 数据服务?为什么我会收到错误消息? 【发布时间】:2011-02-13 07:42:56 【问题描述】:

我正在使用 WCF 数据服务(ADO.NET 数据服务)。我有一个指向 AdventureWorks 数据库的实体框架模型。

当我在 Visual Studio 中调试我的 svc 文件时,它运行良好。我可以说 /awservice.svc/Customers 并取回我期望的 ATOM 提要。

如果我将服务(托管在 ASP.NET Web 应用程序中)发布到 IIS7,相同的查询字符串会返回 500 错误。根 svc 页面本身按预期工作并成功返回 ATOM。 /Customers 路径失败。

这是我的赠款在 svc 文件中的样子:

public class AWService : DataService<AWEntities>

    public static void InitializeService( DataServiceConfiguration config )
    
        config.SetEntitySetAccessRule( "*", EntitySetRights.All );
        config.SetServiceOperationAccessRule( "*", ServiceOperationRights.All );
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    

更新:我启用了详细错误并在 XML 消息中得到以下内容:

<innererror>
<message>The underlying provider failed on Open.</message>
<type>System.Data.EntityException</type>
<stacktrace>
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(
...
...
<internalexception>
<message>
Login failed for user 'IIS APPPOOL\DefaultAppPool'.
</message>
<type>System.Data.SqlClient.SqlException</type>
<stacktrace>
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, ...

【问题讨论】:

【参考方案1】:

在我看来这是一个 SQL 身份验证错误,IIS 在一个无权访问您的 SQL 服务器的用户下运行其 appPool,当您在 Visual Studio(本地)中破坏时,它将是另一个用户。检查服务器上的 IIS 正在使用的用户,并确保它有权在 SQL 中执行您想要的操作。

【讨论】:

我在我的机器上同时运行 IIS 和 SQLServer。我认为我在两者上都使用了 Windows 身份验证。我肯定知道 SQLServer。有什么方法可以检查 IIS? @Pharabus - 你是个天才。我不得不修改 DefaultAppPool 使用的身份帐户。这是一篇关于如何做到这一点的文章:technet.microsoft.com/en-us/library/cc771170%28WS.10%29.aspx。默认情况下,它使用的是低权限帐户。将其设置为 LocalSystem 就可以了。【参考方案2】:

尝试将连接字符串属性Integrated security改为False

【讨论】:

【参考方案3】:

使用 IIS Express 的快速解决方案

    创建防火墙例外以允许 HTTP 请求通过 IIS Express 正在使用的端口上的防火墙。

    如有必要,通过运行 ipconfig 获取开发计算机的 IP 地址。

    在文件夹 %USERPROFILE%\Documents\IISExpress\config 中找到 IIS Express 配置文件 applicationhost.config。 USERPROFILE 环境变量的值通常为 C:\Users\。

    使用记事本或其他文本编辑器打开 applicationhost.config 并进行以下更改。

    找到 Web 服务 WebServiceForTesting 的站点元素。 如果您没有看到 Web 服务的站点元素,则必须至少部署一次服务才能创建该元素。

    在站点元素的绑定部分中,复制绑定元素并将副本粘贴到现有绑定元素的正下方以创建第二个绑定。 在新的绑定元素中,将 localhost 替换为计算机的 IP 地址。 保存更改。

    以管理员身份运行 Visual Studio 并打开 Visual Studio 解决方案。

    在手机应用程序项目中,如果您之前添加了对服务的服务引用,请删除它。 将新服务引用添加到重新配置的 Web 服务。在“添加服务引用”对话框的“地址”框中,将 localhost 替换为您的开发计算机的 IP 地址。点击前往。

    发现并显示 WCF 项目中服务的第二个绑定。点击确定。

    将使用开发计算机 IP 地址的新服务引用添加到 Windows Phone 项目。

【讨论】:

嗨,欢迎来到 ***!你的答案看起来不错,但如果你将它分成几个段落,甚至使用编号/公告列表,它会更具可读性。

以上是关于如何在 IIS 中正确托管连接到 SQLServer 的 WCF 数据服务?为啥我会收到错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

IIS 连接到 SoapUi 时握手失败 (40)

从家庭网络上的 grunt Web 服务器限制 http:// 连接到远程托管 Web 服务器的正确 CORS 条目是啥?

如何从命令行连接到托管的 Team Foundation Service

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

网站部署到 IIS 并连接到 SQL Server 2012 时出现问题,出现找不到网络错误

如何从 docker 容器连接到远程 mysql 托管?