Почему я получаю только часть URL-адреса из HttpContext? - PullRequest
0 голосов
/ 25 октября 2019

Я использую прокси для получения ресурсов с удаленного сервера.

Вот прокси-класс:

public class Proxy : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string url = context.Request["url"];
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.UserAgent = context.Request.UserAgent;
        request.ContentType = context.Request.ContentType;
        request.Method = context.Request.HttpMethod;

        request.ProtocolVersion = HttpVersion.Version11;
        request.KeepAlive = false;
        request.Timeout = 100000;
        request.ReadWriteTimeout = 100000;
        using (var response = request.GetResponse())
        {
            context.Response.ContentType = response.ContentType;
            using (var responseStream = response.GetResponseStream())
            {
                if (responseStream == null) return;

                responseStream.CopyTo(context.Response.OutputStream);
                context.Response.OutputStream.Flush();
            }
        }
    }
}

А вот мой вызов ajax для удаленной службы:

function wfs(layer) {

    let dest_url = "https://www.mysited.com/geodata2055/service/mapagent.fcgi?SERVICE=WFS&MAXFEATURES=500&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=ns216630453:WW_MONITOR";
    let proxy_url = "/localhost/Proxy.ashx?url=";
    let url = proxy_url + dest_url;

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url); // depricated-'/proxy.ashx?url='+

    xhr.onload = function () {
        if (xhr.status === 200) {
            console.log("loader success");
        } else {
            console.log("loader fail");
        }
    },
        xhr.send();
}

при запуске функции wfs запускается функция ProcessRequest в прокси-классе, и значение переменной url равно:

https://www.mysited.com/geodata2055/service/mapagent.fcgi?SERVICE=WFS

В то время как я ожидаю значение url быть:

https://www.mysited.com/geodata2055/service/mapagent.fcgi?SERVICE=WFS&MAXFEATURES=500&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=ns216630453:WW_MONITOR

Кажется, что context.Request["url"] возвращает значение до первого '&'.

Любая идея, почему я получаю из context.Request["url"] только часть URL

1 Ответ

1 голос
/ 25 октября 2019

Вам необходимо закодировать параметр запроса, поскольку он не содержит символов, безопасных для параметров запроса:

let url = "/localhost/Proxy.ashx?url=" + encodeURIComponent(dest_url);

Для дальнейшего объяснения давайте представим, что мы анализатор URL. Без кодировки вы увидите эту строку:

/localhost/Proxy.ashx?url=https://www.mysited.com/geodata2055/service/mapagent.fcgi?SERVICE=WFS&MAXFEATURES=500&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=ns216630453:WW_MONITOR

Парсер будет проходить через эти шаги при посещении символов:

URL path:              /localhost/Proxy.ashx 
Query params starting: ?
Param name:            url
Starting param value:  =
(some of these next chars aren't valid, but I'll try my best!)
Param value:        
   https://www.mysited.com/geodata2055/service/mapagent.fcgi?SERVICE=WFS
Starting next param:   &
Param name:            MAXFEATURES
Starting param value:  =
Param value:           500
...etc

Так как он сталкивается с &при сканировании вашей строки он думает, что такие параметры, как MAXFEATURES, являются параметрами запроса для вашего прокси-запроса, не часть параметра url, переданного прокси-запросу. Поэтому, когда ваш прокси-код работает, он видит только то, что до &.

Кодирование параметра URL даст вам:

/localhost/Proxy.ashx?url=https%3A%2F%2Fwww.mysited.com%2Fgeodata2055%2Fservice%2Fmapagent.fcgi%3FSERVICE%3DWFS%26MAXFEATURES%3D500%26VERSION%3D1.0.0%26REQUEST%3DGetFeature%26TYPENAME%3Dns216630453%3AWW_MONITOR

При этом парсер теперь видит толькоurl параметр передан обработчику прокси. Когда прокси-обработчик теперь анализирует параметр url, он декодирует его, возвращая вам исходный dest_url

Как общее практическое правило, никогда не используйте просто конкатенацию строк длясоздавать URL;URL-адреса не состоят из строк, они состоят из строк в кодировке URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...