Uri ToString()方法解码Uri查询

问题描述 投票:5回答:1

在我的WebAPI项目中,我在重定向方面遇到了一些问题。这是因为Uri.ToString()方法的行为表现为“防御性”,换句话说,一旦调用被提及方法,他便会解码查询字符串的安全部分。

考虑此失败的单元测试:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UriTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            // Arrange
            const string expectedUrlRaw = 
                "http://localhost/abc?proxy=http%3A%2F%2Ftarget.nl%3Fparam1%3Dvalue1%26param2%3Dvalue2";
            const string expectedUrlInHttpsRaw =
                "https://localhost/abc?proxy=http%3A%2F%2Ftarget.nl%3Fparam1%3Dvalue1%26param2%3Dvalue2";

            Uri expectedUri = new Uri(expectedUrlRaw);
            Uri expectedUriInHttps = new Uri(expectedUrlInHttpsRaw);

            // Act
            string returnsUriInHttpsRaw = expectedUri.ToHttps().ToString();

            // Assert
            Assert.AreEqual(expectedUrlInHttpsRaw, returnsUriInHttpsRaw);
        }
    }
    public static class StringExtensions
    {
        public static Uri ToHttps(this Uri uri)
        {
            UriBuilder uriBuilder = new UriBuilder(uri);
            uriBuilder.Scheme = Uri.UriSchemeHttps;
            uriBuilder.Port = 443;
            return uriBuilder.Uri;
        }
    }
}

现在,由于无法控制Uri属性,因此无法通过构造自己的链接来修改此行为。在我的控制器中,我确实以以下方式响应get消息以重定向呼叫:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Found);
            response.Headers.Location = // my Uri object

这可以正常工作到一定程度。如果我的重定向Uri包含一个包含编码链接的查询,它将返回错误的结果。 (这可能是因为Headers.Location是通过对该属性调用ToString来读取的。

有人对如何解决这个问题有想法吗?

谢谢

c# uri httpresponse asp.net-web-api
1个回答
0
投票

Uri.ToString()不会解码URL编码的序列。 (例如%20 =>空格)。在.net框架的不同版本之间,行为也会发生变化。

简而言之,不要使用Uri.ToString()使用Uri.AbsoluteUri或Uri.OriginalString

请参阅以下文章进行深入调查https://dhvik.blogspot.com/2019/12/uritostring-automatically-decodes-url.html

© www.soinside.com 2019 - 2024. All rights reserved.