针对 localhost 相对 url 的请求“无法分配请求的地址”

Posted

技术标签:

【中文标题】针对 localhost 相对 url 的请求“无法分配请求的地址”【英文标题】:Request against localhost relative url "Cannot assign requested address" 【发布时间】:2018-12-28 05:55:07 【问题描述】:

我有一个使用 FROM microsoft/dotnet:2.1-aspnetcore-runtime AS baseFROM microsoft/dotnet:2.1-sdk AS build 图像启用了 docker 支持的 Visual Studio 2017 [ / 2019 ] asp.net 核心 Web 应用程序项目。

当我的 f5 调试实例在 http://localhost:44301/ 上启动时,我尝试针对相对 URL /data/some.json 发出 HttpClient.SendAsync() 请求以提取数据,从而使本地主机调试能够模拟仅存在于已发布应用案例中的安全状态。

当我使用项目的 IISExpress 目标进行 f5 调试时,一切正常。当我针对 Docker 目标进行 f5 调试时,针对 localhost 相对 url 或完全限定的 https://localhost:44301/data/some.jsonhttp://localhost:8081/data/some.json 路径的 HttpClient.SendAsync() 调用会生成带有消息 Cannot assign requested address 的异常。如果我更改代码以从远程 url 加载 some.json,例如存储帐户公共 blob 路径,f5 调试 Docker 目标在此调用中不会失败。

可以使用https://github.com/myusrn/adncauthexploration.git 提供的AzWebApp1 项目重现问题,该项目还需要使用项目引用访问的https://github.com/myusrn/KK.AspNetCore.EasyAuthAuthentication.git,以启用此nuget 包的调试内容。使用 localhost f5 iisexpress 目标问题不会重现。当调试 url 处理命中 KK.AspNetCore.EasyAuthAuthentication\Services\EasyAuthWithAuthMeService.cs | 时切换到 localhost f5 docker 目标问题重现第 109 行var response = await client.SendAsync(httpRequest);

我想知道是否需要进行一些 Dockerfile 设置才能通过 asp.net 核心 Web 应用程序启动代码启用此 f5 调试 localhost 相对 url 请求。

【问题讨论】:

不太清楚你的网络应用为什么会调用自己。 @John,它是为了支持来自相对路径或远程 url 路径的 data/some.json 【参考方案1】:

我使用的是相同的 ASP.NET Core docker 版本,它的工作原理如下所述:

http://host.docker.internal:<port>

再试一次,看看它是否适合你!

【讨论】:

这对我有用。我将它设置在我的appsettings.json“Urls”节点中。 这种方式的问题是VS 2019发布的SSL失效了。 你是救命稻草! OMG 正在为此苦恼。你的答案修复它。谢谢你!【参考方案2】:

要从IIS ExpressSelfHostDocker 访问资源,您可以配置HttpClient.BaseAddress 的Http 请求如下:

public class HomeController : Controller

    private readonly HttpClient httpClient;
    public HomeController(
        , IHttpClientFactory httpClientFactory)
    
        this.httpClient = httpClientFactory.CreateClient();
    
    public async Task<IActionResult> Index()
    
        this.httpClient.BaseAddress = new Uri($"this.Request.Scheme://this.Request.Host");
        var response = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Get,
            "data/some.json"));
        var result = await response.Content.ReadAsStringAsync();

        return View();
    

【讨论】:

感谢您的回复。这就是我已经在做的事情,尝试了完全限定的基地址和相对地址请求。在使用 iisexpress 的 localhost f5 调试会话的情况下,它可以工作,但是当我使用 docker 更改为 localhost f5 调试会话时,它会生成我注意到的错误消息。也许你在建议我如何创建我忽略的请求的一些微妙的不同? @myusrn 是否有任何演示可以重现您的问题? 感谢您继续关注帮助了解此问题和可能的修复。我在原始问题详细信息中添加了 repo 来源说明。 @myusrn 有两个项目,你的意思是从一个docker容器发送请求到另一个? 唯一参与重现此问题的项目是 AzWebApp1 项目和它引用的项目以代替 nuget 包,以便于调试到其源代码,即 localhost /.auth/me 所在的位置。 json 相对 url 调用发生。另请注意,我刚刚通过检查更新了 master 分支,以便启用 startup.cs options.AuthEndpoint = ".auth/me.json"; 设置,这是重现问题所必需的。如 cmets 中所述,使用非本地主机 / 相对 url options.AuthEndpoint = "https://mysawestus.blob.core.windows.net/public/me.json" 使错误消失。

以上是关于针对 localhost 相对 url 的请求“无法分配请求的地址”的主要内容,如果未能解决你的问题,请参考以下文章

重定向与请求转发

杂写笔记一

从 axios 请求 url 中删除 localhost:8080

使用相对于 root 的 url 和本地测试的问题

noob 的 mod 重写和相对 url 的问题

Tomcat下ajax请求路径总结