【发布时间】:2010-05-19 19:42:29
【问题描述】:
您好(抱歉,这篇文章很长),
我正在用 ASP.NET MVC 2 编写一个应用程序,当我远程连接到我的服务器时,我收到了这个错误。
由于检索用户的本地应用程序数据路径失败,无法生成 SQL Server 的用户实例。请确保用户在计算机上有本地用户配置文件。连接将被关闭。
我以为我已经在本地解决了这个问题,因为如果使用以下代码将站点重定向到 baseUrl 时,我会在调试中收到此错误:
protected override void Initialize(RequestContext requestContext)
{
string[] host = requestContext.HttpContext.Request.Headers["Host"].Split(':');
_siteProvider.Initialise(host, LiveMeet.Properties.Settings.Default["baseUrl"].ToString());
base.Initialize(requestContext);
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Site == null)
{
string[] host = filterContext.HttpContext.Request.Headers["Host"].Split(':');
string newUrl;
if (host.Length == 2)
newUrl = "http://sample.local:" + host[1];
else
newUrl = "http://sample.local";
Response.Redirect(newUrl, true);
}
ViewData["Site"] = Site;
base.OnActionExecuting(filterContext);
}
public Site Site
{
get
{
return _siteProvider.GetCurrentSite();
}
}
Site 对象是从名为 siteProvider 的 Provider 返回的,它会进行两次检查,一次针对包含所有可用子域列表的数据库,然后如果未能找到有效的子域或有效域名,则搜索内存缓存保留域,如果没有命中则返回一个baseUrl,所有无效域都被重定向。
当我将 true 添加到 Response.Redirect 时,这在本地起作用,假设暂停当前执行并在浏览器重定向上重新启动执行。
我在堆栈跟踪中发现第二次尝试访问数据库时会引发错误。
#region ISiteProvider Members
public void Initialise(string[] host, string basehost)
{
if (host[0].Contains(basehost))
host = host[0].Split('.');
Site getSite = GetSites().WithDomain(host[0]);
if (getSite == null)
{
sites.TryGetValue(host[0], out getSite);
}
_site = getSite;
}
public Site GetCurrentSite()
{
return _site;
}
public IQueryable<Site> GetSites()
{
return from p in _repository.groupDomains
select new Site
{
Host = p.domainName,
GroupGuid = (Guid)p.groupGuid,
IsSubDomain = p.isSubdomain
};
}
#endregion
首先命中 Linq 查询 ^^^,过滤器为 WithDomain,直到尝试使用 WithDomain 过滤器时才会抛出错误。
总而言之:页面重定向后会出现错误,因此第一次迭代在重定向后不久按预期执行(因此数据库的权限是正确的,用户配置文件等),当它过滤可能的数据库查询时当前重定向页面的域/子域,它会出错。
【问题讨论】:
标签: asp.net-mvc database exception