当前位置:  开发笔记 > 运维 > 正文

当我使用Azure模拟器检查Request.Url.ToString()时,MVC报告不同的端口号

如何解决《当我使用Azure模拟器检查Request.Url.ToString()时,MVC报告不同的端口号》经验,为你挑选了1个好方法。

我从以下网页开始:

http://127.0.0.1:84/Administration/Accounts/Home

然后我选择一个链接,它需要我:

http://127.0.0.1:84/Administration/Accounts/ShowSummary?ds=0001

在ShowSummary剃刀页面的开头,我检查了

Request.Url              http://127.0.0.1:86/Administration/Accounts/ShowSummary?ds=0001}
Request.Url.Authority   "127.0.0.1:86"
Request.UrlReferrer - {http://127.0.0.1:84/Administration/Accounts/Home}

每次我尝试这个时它总是报告端口86而不是端口84.这对我来说很重要,因为我存储了URL.有谁知道它为什么显示不同的端口?正确的端口应为84但Url和Url.Authority报告86



1> astaykov..:

是的,我很清楚为什么会这样.首先,请让我在Windows Azure上分享一个细节,这样您就能够了解问题的本质.

在Windows Azure环境中部署云服务时,它位于负载均衡器(或LB)后面的虚拟机(所谓的实例)中.定义输入端点时,指示要将特定TCP端口路由到实例的Windows Azure基础结构.因此,LB在其防火墙端口80上打开,并将来自该端口的流量路由到您的VM.您的VM上的端口80也会在防火墙中打开.但是有2个不同的主机 - LB和VM,两者都可以有端口80.

为了在本地正确模拟所有行为,Windows Azure Emulator在本地IIS中创建一个Web站点并将其绑定到某个端口(在您的情况下为86!).然后它"模拟"LB并打开端口84(对于模拟的LB).之所以如此,是因为您的角色中可能定义了多个实例.本地模拟器为您定义的每个实例和任何实例创建一个单独的网站.并且每个实例都有自己的指定端口(86,87,88等...),而原始(在您的情况下为84)将只有一个 - 用于模拟LB.

这就是你的Request.Url.Authority是端口86的​​原因 - 因为你的本地站点被绑定到端口86.这就是为什么URLReferer是端口84 - 因为实际的请求来自模拟的负载均衡器,它适用于端口84.

我希望你猜测这不会发生在真正的Azure环境中,因为两个端口都是80.

当人们处理端口时,我通常建议使用IPEndpoint实例,该实例可以从以下方式获得:

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpIn"].IPEndpoint

但你的情况有点不同.您正在记录完整的URL.我不知道ru想要实现什么,但这里有一些提示,你可能会认为有价值:

尝试使用IPEndpoint实例来解析URL并更改端口

只记录路径,而不是完整的URL(跳过地址和端口部分)

希望这可以帮助.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有