본문 바로가기

Troubleshoot

C# SiteMapProvider [HttpException] {0} is not a valid virtual path(올바른 가상 경로가 아닙니다.)

 

Custom SiteMap Provider 생성 시 URL을 http://naver.com 과 같이 가상 경로가 아닌 경우에 오류가 발생하게 됩니다.

 

[HttpException (0x80004005): 'http://naver.com'은(는) 올바른 가상 경로가 아닙니다.]
   System.Web.Util.UrlPath.CheckValidVirtualPath(String path) +11076778
   System.Web.Util.UrlPath.Combine(String appPath, String basepath, String relative) +122
   System.Web.StaticSiteMapProvider.AddNode(SiteMapNode node, SiteMapNode parentNode) +258

 

 

위와 같은 경우에 저는 약간의 꼼수를 써서 해결 하였습니다.

 

AddNode(SiteMapNode node, SiteMapNode parentNode) 를 Override하여 수정하였으며, 코드는 아래와 같습니다.

private SiteMapNode FindChildNodeByID(SiteMapNode ParentNode, string strId)
{
	SiteMapNode smnFindNode = null;
	if (ParentNode != null && ParentNode.ChildNodes.Count > 0)
		foreach (SiteMapNode node in ParentNode.ChildNodes)
		{
			if (node.Key.Equals(strId))
			{
				smnFindNode = node;
				break;
			}
			else if (node.ChildNodes.Count > 0)
				smnFindNode = FindChildNodeByID(node, strId);

			if (smnFindNode != null) break;
		}

	return smnFindNode;
}

protected override void AddNode(SiteMapNode node, SiteMapNode parentNode)
{
	bool isVirture = node.Url.ToLower().StartsWith("http://");
	string strId = node.Key;
	string strUrl = node.Url;

	node.Url = isVirture ? node.Url.Remove(0, 7) : node.Url;
	base.AddNode(node, parentNode);

	if (isVirture && base.RootNode != null && base.RootNode.ChildNodes.Count > 0)
	{
		SiteMapNode childNode = FindChildNodeByID(base.RootNode, strId);

		if (childNode != null)
			childNode.Url = strUrl;
	}
}

 

SiteMapDataSource 사용 시 StartingNodeUrl에서 http://를 제거한 나머지 부분만 적용하게 되면, 제대로 값이 설정됩니다.

 

<asp:SiteMapDataSource runat="server" ID="smdsAdministration" SiteMapProvider="SqlSiteMapProvider" StartingNodeUrl="naver.com" />

 

2011/04/04 - [Developer/[.NET] C#] - Asp.net Create Custom Sql Sitemapprovider Sample 
 

감사합니다.