Asp.net 使用哪种方法检索Sitecore中URL的路径部分?
我正在为Asp.net 使用哪种方法检索Sitecore中URL的路径部分?,asp.net,sitecore,sitecore6,Asp.net,Sitecore,Sitecore6,我正在为HTTPRequest管道编写一个扩展,以重定向传入请求,其中Sitecore可以找到正确的项目,但请求的URL的格式与Sitecore的格式不完全相同。这是为了防止SEO重复内容问题 我要检查的URL部分是符合LinkManager.GetItemUrl(context.item)结果的部分。在本例中,路径中嵌入了语言,例如: www.mysite.com/en-gb/stuff/things 因此GetItemUrl返回/en-gb/stuff/things 无论是在Sitecor
HTTPRequest
管道编写一个扩展,以重定向传入请求,其中Sitecore可以找到正确的项目,但请求的URL的格式与Sitecore的格式不完全相同。这是为了防止SEO重复内容问题
我要检查的URL部分是符合LinkManager.GetItemUrl(context.item)
结果的部分。在本例中,路径中嵌入了语言,例如:
www.mysite.com/en-gb/stuff/things
因此GetItemUrl
返回/en-gb/stuff/things
无论是在Sitecore.Pipelines.HttpRequest.HttpRequestArgs
对象上,还是在System.Web.HttpContext.Current.Request.Url
对象上,我都找不到正确的方法
我可以得到整个URL或路径减去语言嵌入。哪个object.method将为我提供
/en gb/stuff/things
?我不确定我是否正确理解了您的意思,但似乎您要查找的是System.Web.HttpContext.Current.Request.RawUrl
。如果没有,请详细说明您想要实现的目标。这不是一个直接的答案,但它可能会很有用,因为Sitecore在实现(我认为)您的目标时,在组合中加入了一些技巧
从记忆中
如果(且仅当)linkmanager设置为LanguageEmbedding“always”或“asNeeded”,则条带语言管道处理器将删除URL的语言部分。如果设置为“从不”,则不会对HttpRequest中的url执行任何操作。如果将剥离路径与LinkManager中的前缀路径进行比较,这可能会影响路径比较
您可以在stripLanguage步骤之前添加管道步骤,该步骤根据需要将传入URL添加到HttpRequest中的字典中
public class StoreOriginalRequestUrl : PreprocessRequestProcessor
{
public override void Process(PreprocessRequestArgs args)
{
args.Context.Items["OriginalRequestUrl"] = args.Context.Request.RawUrl;
}
}
…然后,您可以在项目解析程序之后的后续步骤中选择此选项。我假设这就是您正在做的-将请求URL与Linkmanager中上下文项的URL进行比较
我认为您可以将linkmanager返回的Url字符串解析为Uri对象,并比较其中的路径。当提供一个完全限定的URL时,它似乎表现得更好,因此也许可以修改从GetDefaultOptions()返回的URLPOPTIONS以提供一个URL
保罗谢谢。我希望在进行比较之前也修剪查询字符串,但是如果没有RawUrl减去QueryString方法,那么答案就是你的。你可以从查询字符串中的任何问号截断RawUrl值。是的,我知道,我只是希望尽可能减少字符串操纵。谢谢,这里有一些好的建议。Request.URl对象上有一个OriginalString属性,可以确保您获得原始数据(尽管包括端口号),但一定要记住,各种管道在传递HttpContext对象时会修改它,因此,在管道列表中获得正确的位置需要一点思考。StripLanguage管道(6.4)覆盖了OriginalString属性。在ItemResolver之后观察到,语言不存在。我觉得这与直觉背道而驰@Paul George,我正在使用您的建议并在StripLanguage处理器之前记录原始请求的路径。我没有找到一个很方便的东西来存放它,但它似乎很管用。我将该值存储在HttpRequest的Browser.Capabilities字典中,稍后可以在管道中的ItemResolver之后从中检索该值。当您对中的-->字典说“到”时,您建议将其存储在何处HttpRequest@Isubi我已经添加了一个示例,虽然是从内存中添加的。您应该能够在请求中存储args.Context.Items字典。