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;
}

信じられないかもしれませんが、Web ページで生成される出力は次のとおりです。

出力

それを myURL にコピーすると、次のようになります: "http://sar.smg.com.ar/Default.aspx?TabID=912"
トリミングとToLower myURL.
新しい URL は「http://sar.smg.com.ar/default.aspx?tabid=912」です。
「:80」を置き換えます。
新しい URL は「http://sar.smg.com.ar/default.aspx?tabid=912」です。
「http://」を置き換えます。
新しい URL は「intranetqa/default.aspx?tabid=912」です。
「/」の後のすべてを削除します。
新しい URL は「intranetqa」です

GetPortalAlias が「intranetqa」を返す

そのため...何らかの理由で、置換セクションに到達するたびに、「sar.smg.com.ar」ではなく「intranetqa」で始まるように不思議なことに変異します。「intranetqa」はデフォルトのホスト名です。何らかの方法で HTTP:// の文字を変更または削除すると、文字列が変更されます。

2 つの文字列が等しい場合、コンパイラがそれらを同じ場所に格納することを認識しているため、エラーを防止したかっstring.copyたためです。これらの行を削除して直接使用Request.Url.ToString()myURLても、何も起こりません。それらは、それが機能するかどうかを確認するための単なるテストでした。

これが私が試したことのリストです:

  • string/のすべての組み合わせString、どれも機能しませんでした。
  • 試してみたところRequest.Host.Url、「intranetqa」が表示されました。
  • 私は使用Request.Url.AbsoluteUriしたことがあります。そのため、replace :80 行があります。
  • この機能を使用すると、イントラネット.tochararrayの機能が戻ってきます
  • myURL = myURL.Substring(6) はイントラネットの問題を返します。
  • string.Contains("sar.smg.com.ar") は false を返します。

トリックはここにあると思います

  • Uri uriAddress1 = Request.Url;"The parts are <br>" + "Part 1: " + uriAddress1.Segments[0] + "<br>Part 2: " + uriAddress1.Segments[1];Part1 : "/" および Part 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://intranetqaますhttp://sar.smg.com.ar。これらの文字列の先頭を剥がすhttp://と、一致しなくなるため、交換は行われなくなります。

元の要求 URL/ホストが何であるかを知りたい場合は、リバース プロキシが元の URL を使用して要求に追加のヘッダーを追加するか、そのように構成できることを願っています。

于 2012-10-16T15:56:14.590 に答える
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 に答える
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 に答える