2012-11-26 64 views
2

我使用基本身份验证我的Web API和正在以下错误错误的connectionStringName属性不允许

* {“消息”,“ExceptionMessage”:“网络(SQL Server)连接到服务器时发生错误或特定于实例的错误未找到服务器或无法访问服务器验证实例名称是否正确以及SQL Server是否配置为允许远程连接(提供程序:命名管道提供程序,错误:40 - 无法打开连接到SQL *

它工作绝对没问题,当我从我的API中删除基本的身份验证实施,所以我猜测问题应该是与system.w相关的东西eb.providers用于基本身份验证实现。

这是我的连接字符串看起来像

<connectionStrings> 
<add name="DefaultConnection" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM" 
    providerName="System.Data.SqlClient" /> 
<add name="WinBoutsConnectionString" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM" 
    providerName="System.Data.SqlClient" />  

,我看到在我的web.config的错误,其中添加了会话提供。错误说“不允许connectionStringName属性”。但是,如果我删除它然后它要求connectionStringName。这是它的代码。

<!-- 
     If you are deploying to a cloud environment that has multiple web server instances, 
     you should change session state mode from "InProc" to "Custom". In addition, 
     change the connection string named "DefaultConnection" to connect to an instance 
     of SQL Server (including SQL Azure and SQL Compact) instead of to SQL Server Express. 
    --> 
<sessionState mode="Custom" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="WinBoutsConnectionString" /> 
    </providers> 
</sessionState> 

任何人都可以请告诉我我哪里可能会出错吗?任何建议或意见将深受赞赏。

+2

您正在使用什么版本的.NET和该网站配置了什么版本? – Oded

+0

他们都是相同的4.0版本!如果他们不同,那么当我删除基本身份验证实现时,该网站不会工作!任何其他想法? – Bitsian

回答

2

终于解决了这个问题。问题出在我的基本认证过滤器类中。

private bool TryGetPrincipal(string username, string password, out IPrincipal principal) 
    {  string connectionString = ConfigurationManager.ConnectionStrings["WinBoutsConnectionString"].ConnectionString;  

     username = username.Trim(); 
     password = password.Trim(); 

     //only supporting SSO login atm 
     // var valid = Membership.Provider.ValidateUser(username, password); 
     serviceContext = new WinBoutsDataContext<DataAccess.Model.UserInfo>(connectionString); 
     userRepository = new UserRepository(serviceContext); 

     var valid = this.userRepository.ValidateAccount(username, password); 

     if (valid) 
     { 
      // once the user is verified, assign it to an IPrincipal with the identity name and applicable roles 
      principal = new GenericPrincipal(new GenericIdentity(username), System.Web.Security.Roles.GetRolesForUser(username)); 
      return true; 
     } 

     //user wasn't found, unauthorised 
     principal = null; 
     return false; 
    } 

我在这里硬编码了我的DataContext,但是之前我没有把我的连接字符串传递给它。我只是去了WinBoutsDataContext的默认构造函数,当我把代码放到服务器上时,它没有工作。

1

如果你想使用已定义的connectionString,你必须使用连接字符串的名称,以填补“sqlConnectionString”属性,并使用SQLServer模式:

<configuration> 
    <connectionStrings> 
    <add name = "myString" 
     connectionString = "data source=local;user id=User;password=password" /> 
    </connectionStrings> 
    <system.web> 
    <sessionState 
     mode="SQLServer" 
     sqlConnectionString="myString" 
     cookieless="false" 
     timeout="20" 
    /> 
    </system.web> 
</configuration>