C# · 12月 26, 2021

c# – 来自Request.Url.ToString()的字符串在操作/比较第一个字符时,会重新更改为另一个字符串

我知道有更简单的方法来做到这一点,相信我,我试过了.我当然可以接受任何建议=).你不需要阅读整个代码,只是说明问题所在的部分.此外,我正在debbugging 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;}

相信与否,网页中产生的输出是:

Copying it to myURL,it’s Now: “http://sar.smg.com.ar/Default.aspx?TabID=912″Trimming and ToLower myURL.The new url is “http://sar.smg.com.ar/default.aspx?tabid=912″Replacing the “:80”.The new url is”http://sar.smg.com.ar/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”

所以…由于某种原因,只要它到达替换部分,它神秘地突变,以“intranetqa”而不是“sar.smg.com.ar”开头. “intranetqa”是我们的默认主机名.更改或使用HTTP的任何字符://以任何方式转播STRING.

我做一个string.copy,因为我知道如果两个字符串相等,编译器将它们存储在同一个地方,所以我想防止错误.将这些线条移开并使用Request.Url.ToString()tomyURL直接不执行任何操作.他们只是一个考验,看看是否有效.

以下是我尝试过的内容的列表:

> string / String的所有组合都无效.
>我已经尝试过Request.Host.Url,它只是给了我“intranetqa”.
>我使用了Request.Url.AbsoluteUri,这就是为什么我有替换
80行.
>使用.tochararray功能让我回到了INTRANETQA THING
> myURL = myURL.Substring(6)返回intranetqa的东西.
> string.Contains(“sar.smg.com.ar”)返回false.

我相信诀窍在这里:

> Uri uriAddress1 = Request.Url;和“这些部分是< br>” “第1部分:”uriAddress1.Segments [0]“< br>第2部分:”uriAddress1.Segments [1];给出Part1:“/”和第2部分:“Default.aspx”.尝试访问第3部分(索引2)提供了一个例外.
request.url没有第一部分,但是当我调用ToString()方法时,它确实有一个“假的”第一部分

解决方法 在浏览器和服务器之间是一个反向代理和一个输出重写器.这些可能是相同的组件或单独的组件.

您的服务器实际看到的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://sar.smg.com.ar替换http:// intranetqa.一旦你剥离了这些字符串前面的http://,它不再是匹配,所以替换不再发生.

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