c# - WCF 数据服务更新返回 401-未经授权 : Access is denied due to invalid credentials

标签 c# wcf service

我有一个 WCF 数据服务,并且尝试在 DataServiceContext 客户端上使用 UpdateObject 方法。当我调用 SaveChanges 方法时,出现以下错误页面:

Unauthorized: Access is denied due to invalid credentials
You do not have permission to view this directory or page using the credentials that you supplied.

有人知道如何解决这个问题吗?我发现this ,理论上这可以解决问题,但设置此磁盘访问对于生产服务来说并不是一个现实的解决方案。请记住,在我的本地计算机上运行此 WCF 数据服务时,它工作得很好。我的调用的 C# 代码如下:

        public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
    {
        var userName = ( string ) context[ "UserName" ];
        var isAuthenticated = ( bool ) context[ "IsAuthenticated" ];
        if (userName != null && userName.Length >= 1 && collection.Count >= 1)
        {
            var allNames = string.Empty;
            var allValues = string.Empty;
            byte[] buf = null;
            PrepareDataForSaving( ref allNames, ref allValues, ref buf, true, collection, isAuthenticated );
            if (allNames.Length != 0)
            {
                var client = GetDataContext( );
                var profile = client.ProfileViews.Where(p => p.UserName == userName).FirstOrDefault();
                if (profile == null)
                {
                   profile = new ProfileView() { UserName = userName };
                    client.AddToProfileViews(profile);
                }
                profile.PropertyNames = allNames;
                profile.PropertyValuesString = allValues;
                profile.PropertyValuesBinary = buf;
                profile.LastUpdateDate = DateTime.UtcNow;


                client.UpdateObject(profile);
                client.SaveChanges( );
            }
        }
    }

最佳答案

我在使用 WCF 数据服务的 Silverlight 应用程序中遇到了类似的问题。用户可以查看应用程序中的数据——数据库中的 SELECTS 正在运行——但他们收到相同的“401 - 未经授权:由于凭据无效,访问被拒绝”。您正在描述他们何时尝试将更改保存到数据库(即在代码中执行 SaveChanges 时)。根本问题最终是 IIS 应用程序文件夹本身的权限问题。要修复此问题,我们必须向 WCF 服务使用的应用程序池授予对该文件夹的写入权限。

  1. 转到 IIS,右键单击包含 WCF 服务的虚拟目录,然后选择“管理应用程序”->“高级设置...”。记下应用程序池名称。

  2. 在同一右键菜单中,选择“编辑权限”...在“安全”选项卡上,检查组和用户名。

  3. 如果应用程序池的名称丢失。使用名称格式“IIS APPPOOL\MyApplicationPoolName”添加它。请参阅此有用链接:http://www.bluevalleytech.com/techtalk/blog/assigning-ntfs-folder-permission-to-iis7-application-pools/

  4. 确保 MyApplicationPoolName 具有写入权限(我们实际上给了它完全控制权)

关于c# - WCF 数据服务更新返回 401-未经授权 : Access is denied due to invalid credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072675/

相关文章:

wcf - 具有 WCF Web 角色并通过 web.config 限制 IP 的 Windows Azure

wsdl - 从 Web 服务端点地址获取 WSDL

c# - 服务层和存储库关系

c# - 当前服务的名称,以防同一个 exe 被设置为多个服务

C# 将 1D 数组拆分为每个第 N 个值的 2D 数组

c# - LINQ TO SQL 中的查询未插入

c# - 用于测量服务器响应时间的等效 Java 代码

javascript - 使用 javascript 自动选择下拉列表并运行 jquery

wcf - 如何使用 SvcUtil.exe 在不覆盖服务配置名称的情况下设置命名空间?

c# - WCF 服务超时,然后执行操作?