Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用哪种方法检索Sitecore中URL的路径部分?_Asp.net_Sitecore_Sitecore6 - Fatal编程技术网

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字典。