2009-09-23 69 views
1

我使用WCF創建與IIS託管以下文件佈局的SOAP服務:在WCF中繼承web.config文件和HttpContext錯誤?

/ 
/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.config。

這看起來像一個錯誤,我似乎無法找到解決方案,而不是將appSettings放入/web.config文件。

也許這是WCF,在第一次命中時,不考慮/ service目錄作爲執行的根,因爲test.svc沒有被編譯(或者它調用的緩存被調用),但是呢?那麼在第一次命中之後,它會在web.config繼承順序中考慮該目錄?

更新:根據下面的註釋,你會看到,即使HttpContext.Current僅在第一次命中時爲空,但是之後的每次命中都不爲空(在服務上具有正確的web.config和屬性以允許ASP.NET兼容模式)。似乎沒有正確加載web.config只是一個更大問題的症狀。

+0

這同樣發生在ConfigurationManager中。 – wojo 2009-09-24 12:51:36

+0

這變得很奇怪。我正在調試HttpContext.Current(查看一些配置文件路徑的私有字段等),並且它在第一次命中時始終爲空。之後,HttpContext.Current可用。 這是利用和服務的屬性,以便能夠到達HttpContext,順便說一句。 – wojo 2009-09-24 13:08:46

+0

另請參閱MS Connect錯誤:https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=491844 – wojo 2009-09-24 13:45:06

回答

0

這可能與您如何以及何時將數據加載到WebConfigurationManager中有關。

更新:

可能與權利有關。第一次命中爲匿名,第二次爲已驗證。因此,第二個是允許讀取數據。

您需要檢查:

  • IIS安全
  • 安全設置在web.config中
  • 應用程序池的
  • 身份
  • ACL的web.config文件

更新2 :

在黑暗中拍攝:當它不可用時,你是否過早閱讀HttpContext?你的代碼是從init調用的嗎?也許把它移動到頁面加載?

+0

嗯,我沒有做任何特定的事情(手動加載它)。我讓ASP.NET/WCF管道自動加載我的web.config文件,只是使用AppSettings屬性來正常地獲取我的appSettings。 我嘗試手動加載web配置,但在第一次點擊時失敗。 – wojo 2009-09-24 12:52:40

+0

好的想法,如果它只是web.config。我確實檢查了我的安全設置,並且一切都很正常。 但是,真正讓我感到的是HttpContext.Current屬性在第一次打擊時也是null。這應該與ACL /身份驗證狀態等無關,對吧? – wojo 2009-09-24 13:46:04

+0

它在我的服務中可用,在認證之後(但對我來說已經太遲了)。我通過繞過我的驗證器來測試它,它確實可用。但是,這似乎是一個錯誤,因爲它也應該在我的驗證器的第一次打擊時可用。畢竟,它在每一個後續命中都可用! – wojo 2009-09-24 14:10:07