9

我知道有更简单的方法可以做到这一点,相信我,我已经尝试过了。我当然愿意接受任何建议 =)。您无需阅读整个代码,只需阅读说明问题所在的部分即可。另外,我正在调试 perl 风格,所以你们可以看到。哦,我有没有提到在我的开发环境中一切都按预期工作?

这是代码:

string GetPortalAlias()
{
    String myURL2 = Request.Url.ToString();
    URLLabel.Text = "Original Request.Url.ToString() returned: \"" + myURL2 + "\"";
    string myURL = string.Copy(myURL2);
    URLLabel.Text = "Copying it to myURL, it's now: \"" + myURL + "\"";
    myURL = myURL.ToLower().Trim();
    URLLabel.Text += "<br>Trimming and ToLower myURL.<br>The new url is \"" + myURL + "\"" + "<br>";
    myURL = myURL.Replace(":80", "");
    URLLabel.Text += "Replacing the \":80\".<br> The new url is\"" + myURL + "\"<br>";


    //***HERE LIES THE PROBLEM***
    myURL = myURL.Replace("http://", "");
    URLLabel.Text += "Replacing the \"http://\".<br> The new url is\"" + myURL + "\"<br>";
    //***PROBLEM ENDS***


    myURL = myURL.Remove(myURL.IndexOf("/"));
    URLLabel.Text += "Removing everything after the \"/\"." + "<br> The new url is \"" + myURL + "\"<br>";
    URLLabel.Text += "<br>GetPortalAlias Returning \"" + myURL + "\"";
    return myURL;
}

信不信由你,网页中产生的输出是这样的:

输出

将其复制到 myURL,现在是:“http://sar.smg.com.ar/Default.aspx?TabID=912”
修剪和降低 myURL。
新网址是“http://sar.smg.com.ar/default.aspx?tabid=912”
替换“:80”。
新的网址是“http://sar.smg.com.ar/default.aspx?tabid=912”
替换“http://”。
新网址为“intranetqa/default.aspx?tabid=912”
删除“/”之后的所有内容。
新网址是“intranetqa”

GetPortalAlias 返回“intranetqa”

所以......由于某种原因,每当它到达替换部分时,它就会神秘地变异为以“intranetqa”而不是“sar.smg.com.ar”开头。“intranetqa”是我们的默认主机名。以任何方式更改或删除 HTTP:// 的任何字符都会改变字符串。

我这样做是string.copy因为我知道如果两个字符串相等,编译器会将它们存储在同一个地方,因此我想防止错误。拿走这些线并直接使用Request.Url.ToString()tomyURL根本没有任何作用。他们只是一个测试,看看这是否有效。

这是我尝试过的事情的清单:

  • string/的所有组合String,没有一个有效。
  • 我试过Request.Host.Url了,它只是给了我“intranetqa”。
  • 我用过Request.Url.AbsoluteUri,这就是为什么我有 replace :80 行。
  • 使用该.tochararray功能让我回到了 InTRANETQA 的东西
  • myURL = myURL.Substring(6) 还给了 Intranetqa 的东西。
  • string.Contains("sar.smg.com.ar") 返回错误。

我相信诀窍就在这里

  • Uri uriAddress1 = Request.Url;"The parts are <br>" + "Part 1: " + uriAddress1.Segments[0] + "<br>Part 2: " + uriAddress1.Segments[1];给出第 1 部分:“/”和第 2 部分:“Default.aspx”。尝试访问第 3 部分(索引 2)会出现异常。request.url 没有第一部分,但是当我调用 ToString() 方法时,它确实有一个“假”的第一部分
4

5 回答 5

11

在您的浏览器和服务器之间是一个反向代理和一个输出重写器。这些可能是相同的组件,也可能是不同的组件。

您的服务器实际看到的 URL 始终是这种形式http://intranetqa/default.aspx?tabid=912(在反向代理/URL 重写器拦截了请求之后)。

您的服务器产生的输出实际上是这样的:

Copying it to myURL, it's now: "http://intranetqa/Default.aspx?TabID=912"
Trimming and ToLower myURL.
The new url is "http://intranetqa/default.aspx?tabid=912"
Replacing the ":80".
The new url is"http://intranetqa/default.aspx?tabid=912"
Replacing the "http://".
The new url is"intranetqa/default.aspx?tabid=912"
Removing everything after the "/".
The new url is "intranetqa"

GetPortalAlias Returning "intranetqa" 

输出重写器正在检查服务器的输出并替换http://intranetqawith http://sar.smg.com.ar。一旦你http://从这些字符串的前面剥离,它就不再匹配,因此不再发生替换。

如果您想知道原始请求 URL/主机是什么,希望反向代理可以或可以配置为使用原始 URL 向请求添加额外的标头。

于 2012-10-16T15:56:14.590 回答
1

你可以试试这样的

Uri uriAddress1 = new Uri("http://www.contoso.com/title/index.htm");
Console.WriteLine("The parts are {0}, {1}, {2}", uriAddress1.Segments[0], uriAddress1.Segments[1], uriAddress1.Segments[2]);

Uri.Segments 属性

这是处理 URI 及其段的更好方法。

于 2012-10-16T14:46:19.603 回答
1

您不想实现这里所做的部分工作吗?

就像是

string host = Request.Url.IsDefaultPort ?
    Request.Url.Host :
    Request.Url.Authority;

如果您想坚持使用旧方法,请像这样更改

string GetPortalAlias()
{
    var rawUrl = Request.Url.ToString();
    var lowerTrimmedUrl = rawUrl.ToLower().Trim();
    var withoutPortUrl = lowerTrimmedUrl.Replace(":80", "");
    var withoutProtocolUrl = withoutPortUrl.Replace("http://", "");
    var justHostUrl = withoutProtocolUrl.Remove(myURL.IndexOf("/"));

    var evolution = new StringBuilder();
    evolution.AppendFormat(
        "{0}<br>", 
        HttpUtility.HtmlEncode(rawUrl));
    evolution.AppendFormat(
        "{0}<br>",
        HttpUtility.HtmlEncode(lowerTrimmedUrl));
    evolution.AppendFormat(
        "{0}<br>",
        HttpUtility.HtmlEncode(withoutPortUrl));
    evolution.AppendFormat(
        "{0}<br>",
        HttpUtility.HtmlEncode(withoutProtocolUrl));
    evolution.AppendFormat(
        "{0}<br>",
        HttpUtility.HtmlEncode(justHostUrl));

    URLLabel.Text = evolution.ToString();
    return justHostUrl;
}

所以你可以看到发生了什么。

于 2012-10-16T14:52:44.933 回答
1

尝试使用此属性:

String myURL2 = Request.Url.AbsoluteUri;
于 2012-10-16T15:01:27.020 回答
1

这是我用来拉取 SiteRootPath 的扩展方法。您应该能够根据需要轻松调整它。您将需要访问 HttpContext 以获得我目前在下面拥有的内容,但是,您听起来并不需要它。

using System;
using System.Web;

namespace FlixPicks.Web.Extensions
{
    public static class HttpContextExtensions
    {
        public static string SiteRootPath(this HttpContext context)
        {
            if (context == null || context.Request == null) { return null; }

            return context.Request.Url.SiteRootPath(context.Request.ApplicationPath);
        }

        public static string SiteRootPath(this HttpContextBase context)
        {
            return context.Request.Url.SiteRootPath(context.Request.ApplicationPath);
        }

        private static string SiteRootPath(this Uri url, string applicationPath)
        {
            if (url == null) { return null; }

            // Formatting the fully qualified website url/name.
            string appPath = string.Format(
                        "{0}://{1}{2}{3}",
                        url.Scheme,
                        url.Host,
                        url.Port == 80 ? string.Empty : ":" + url.Port,
                        applicationPath);

            // Remove ending slash(es) if one or more exists to consistently return
            // a path without an ending slash.  Could have just as well choosen to always include an ending slash.
            while (appPath.EndsWith("/") || appPath.EndsWith("\\"))
            {
                appPath = appPath.Substring(0, appPath.Length - 1);
            }

            return appPath;
        }
    }
}

祝你好运,汤姆

于 2012-10-16T15:24:03.760 回答