2012-10-22 26 views
3

我的web應用程序(WCF服務)使用SqlRoleProvider,它在上可以正常工作,Visual Studio Development Server。它切換到IIS8快遞導致它拋出一個NullReferenceException雖然:IIS8 Express上的SqlRoleProvider

Roles.IsUserInRole(username, role) // neither of them actually null 

我無法找到此異常the IsUserInRole method documentation的提示。切換回Visual Studio開發服務器使其工作。這種例外的原因是什麼,我怎樣才能正確地修復它?該項目的目標框架.NET Framework 4

下面是配置的連接字符串:

<add name="ConnectionString" 
     connectionString="Data Source=.\sqlexpress;Initial Catalog=DevWeb;Integrated Security=True" 
     providerName="System.Data.SqlClient" /> 

這是roleManager/providers節點:

<clear /> 
<add connectionStringName="ConnectionString" applicationName="MyApp" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider"/> 
+0

是的,你說得對,我看到的cookie沒有什麼,你只要運行該功能直接。 – Aristos

+0

我開始看到同樣的問題(安裝最新的VS2013 RC之後)。你發現問題是什麼? –

回答

0

相當肯定您的問題將是與數據庫和賬戶的訪問權限它。嘗試將您的IIS帳戶添加到sa priv並查看問題是否解決。如果這樣做,那麼你有一個失蹤的許可。

+0

謝謝Mike。它在我自己的帳戶下運行,而且我對數據庫有權限。 –

+0

有沒有機會看看你的connString和角色提供者配置? –

+0

是的,當然。我將它添加到問題中。 –

1

如果你在不同的線程中調用Roles.IsUserInRole,那麼你應該檢查HttpContext。在這種情況下將是空的。因此,對於修復,您應該將HttpContext從主線程複製到子線程。

 var context = HttpContext.Current; 
     Thread thread = new Thread(delegate() { 
      if (HttpContext.Current == null) 
       HttpContext.Current = context; 
     }); 

     thread.Start(); 
4

弗拉基米爾說的是真實的,但實際上並沒有解釋發生了什麼。引發NullReferenceException的是IsUserInRole和GetRolesForUser中的EtwTrace代碼。 Roles類中的其他所有內容都說明了HttpContext.Current可以爲null。我在「微軟參考資源」中找到了「NET版本4.5」的代碼http://referencesource.microsoft.com/netframework.aspx

在我試過的每個其他測試環境中,跟蹤級別不足以觸發NullReferenceException。只有在安裝Visual Studio 2013之後使用IIS Express 8時,我纔看到問題,並且只在IIS Express中出現。

你能做些什麼呢?

一個選項是爲WCF啓用「ASP.Net兼容模式」。 首先,在web.config中,將屬性aspNetCompatibilityEnabled =「true」添加到節點<配置> <system.serviceModel> <serviceHostingEnvironment>。然後通過將類[System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]添加到類定義中,選擇您的服務類進入行爲。啓用此功能後,將填充HttpContext.Current當你從Roles類請求角色時,假設你沒有像後面提到的Vladimir這樣的後臺線程工作(在這種情況下,你需要首先修補HttpContext.Current)。您可以閱讀有關WCF的ASP.NET兼容模式的更多信息,網址爲http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx

另一種選擇是繞過這兩種方法的Roles類。而不是調用Roles.IsUserInRole,請調用Roles.Provider.IsUserInRole。而不是調用Roles.GetRolesForUser,請調用Roles.Provider.GetRolesForUser。每種方法都有相同的過載可用。您會失去跟蹤停止位置和本地角色緩存,但繞過空引用異常。