【问题标题】:Inherited web.config files and HttpContext bug in WCF?WCF 中继承的 web.config 文件和 HttpContext 错误?
【发布时间】:2009-09-23 22:49:38
【问题描述】:

我正在使用 WCF 创建 SOAP 服务,并在 IIS 上托管以下文件布局:

/
/web.config
/service
/service/test.svc
/service/web.config

在 /web.config 中,我有一些常规设置(system.codedom 等),在 /service/web.config 中,我有一个 appSettings 部分,其中定义了一些设置。

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="Username" value="user" />
    <add key="Password" value="password" />
  </appSettings>

然后我有自定义密码验证器:

public class CustomUserNameValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        string expectedUsername = WebConfigurationManager.AppSettings["Username"];
        string expectedPassword = WebConfigurationManager.AppSettings["Password"];

        ... snip ...
    }
}

这就是奇怪的地方:

  • 第一次访问此服务时,expectedUserName 和 expectedPassword 为空
  • 在第二次和后续点击中,这两个变量包含 /service/web.config 文件中的值
  • 如果您获得第二次或后续命中并且它确实按预期工作,则简单地重新启动 Web 服务器或重新编译将破坏下一次命中

事实上,它实际上是在第一次点击时从 /web.config 加载 appSettings 部分,然后在 WCF 缓存 WSDL/XSD 等的创建之后,它使用 /service/web。配置。

这似乎是一个错误,除了将 appSettings 放入 /web.config 文件之外,我似乎找不到解决方法。

也许它是 WCF,在第一次命中时,没有考虑 /service 目录是执行的根目录,因为 test.svc 没有被编译(或者它所做的任何缓存被调用),但是?然后在第一次命中之后,它确实考虑了 web.config 继承顺序中的那个目录?

更新:根据下面的 cmets,您会看到即使 HttpContext.Current 仅在第一次点击时为空,但之后的每一次点击都不是空的(使用正确的 web.config 和服务属性允许 ASP.NET 兼容模式)。 web.config 没有正确加载似乎只是一个更大问题的征兆。

【问题讨论】:

  • ConfigurationManager 也会发生这种情况。
  • 这越来越奇怪了。我正在调试 HttpContext.Current (查看配置文件路径的一些私有字段等),第一次命中时它始终为空。之后,HttpContext.Current 可用。这是利用 和服务上的属性来访问 HttpContext,顺便说一句。
  • 查看 MS Connect 错误:connect.microsoft.com/wcf/feedback/…

标签: .net wcf iis web-config


【解决方案1】:

原来这是 .NET 3.5 中的一个错误。 Microsoft 已通知我已在 .NET 4.0 beta 2 中修复(http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=491844 有详细信息)

【讨论】:

    【解决方案2】:

    这可能与您将数据加载到 WebConfigurationManager 的方式和时间有关。

    更新:

    可能与权利有关。第一次点击是匿名的,第二次是经过身份验证的。因此,允许 second 读取数据。

    您需要检查:

    • IIS 安全性
    • web.config 中的安全设置
    • 应用程序池的标识
    • web.config 文件的 ACL

    更新 2:

    在黑暗中拍摄:您是否过早地阅读 HttpContext,因为它不可用?你的代码是从init调用的吗?也许将其移至页面加载?

    【讨论】:

    • 好吧,我没有做任何具体的事情(手动加载)。我让 ASP.NET/WCF 管道自动加载我的 web.config 文件,并且只使用 AppSettings 属性来正常获取我的 appSettings。我确实尝试过手动加载网络配置,但在第一次点击时失败了。
    • 如果它只是 web.config 的想法很好。我确实检查了我的安全设置,一切看起来都很好。然而,真正让我感动的是 HttpContext.Current 属性在第一次点击时也是空的。这应该与 ACL/身份验证状态等无关,对吧?
    • 它在我的服务本身中可用,经过身份验证(但这对我来说太晚了)。我通过绕过我的验证器对此进行了测试,它确实可用。但这似乎是一个错误,因为它也应该在我的验证器中的第一次命中时可用。毕竟,它在随后的每一次点击中都可用!
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多