我从以下网页开始:
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
是的,我很清楚为什么会这样.首先,请让我在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(跳过地址和端口部分)
希望这可以帮助.