【发布时间】: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