javascript - 为什么我只从 HttpContext 中获取部分 URL?

标签 javascript c# .net httpwebrequest

我使用代理从远程服务器获取资源。

这是代理类:

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 的一部分吗?

最佳答案

您需要对查询参数进行编码,因为它不包含对查询参数安全的字符:

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 编码的字符串组成。

关于javascript - 为什么我只从 HttpContext 中获取部分 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58563768/

相关文章:

javascript - 为什么淡入和动画不同时发生?

javascript - Draft.js 编辑器组件不可编辑

c# - 逐行分析,如果符合条件则存储,否则忽略

c# - 如何在查询完成之前按顺序开始处理并行查询的结果?

javascript - 错误 : <rect> attribute y: Expected length, "NaN"。 D3JS

javascript - 如何获取 http GET 请求中不断变化的值?

c# - 如何创建属性包含点(句点)的 json 字符串?

c# - WPF 文本框绑定(bind)百分比

javascript - 如何在.Net中获取javascript的Date.parse()?

c# - 阅读 C# 中的打开文件问题