我正在使用 MVC3 创建一个网站,我使用 razor 语法来创建视图,并且所有这些都在 azure 下运行。
目前我在本地的azure模拟器下运行。
我在网址上有一个视图:'http://localhost:81/Blah/Foo'。
在该视图中,我想获取另一个操作的 Url。
为了实现这一点,我使用: Url.Action("SomeAction", "SomeController", null, this.Request.Url.Scheme)
但是,由于负载平衡,azure 模拟器会更改请求的端口号。
即,当它在端口 81 上运行时,请求可能来自端口 82。
这会导致创建不正确的 url 'http: //localhost:82/Blah/Bar',我收到 400 错误主机名错误。
按照这篇文章中的信息http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/9142db8d-0f85-47a2-91f7-418bb5a0c675/ 我发现我可以获得正确的结果使用 HttpContext.Request.Headers["Host"] 的主机和端口号。
但我只能将主机名传递给 Url.Action,如果我尝试传递主机名和端口,那么它仍然会附加它认为正确的端口,所以我最终会得到 localhost:81:82。
编辑:我发现有人有同样的问题。他们似乎收集了与我相同的信息(除了他们也包含了复制品),但他们没有有用的修复,因为我无法手动指定端口号。
http://social.msdn.microsoft.com/Forums/en-US/windowsazuredevelopment/thread/87c729e8-094c-4578-b9d1-9c8ff7311577/
我想一个解决办法是我自己的 Url.Action 重载让我可以指定端口。
I'm creating a website using MVC3, I'm using the razor syntax to create the views and it's all running under azure.
Currently I'm running under the azure emulator locally.
I have a view at the url: 'http://localhost:81/Blah/Foo'.
In that view I want to get the Url for another action.
To achieve this I use: Url.Action("SomeAction", "SomeController", null, this.Request.Url.Scheme)
However because of the load balancing the azure emulator does the port number the request is made on changes.
i.e. whilst it's running on port 81, the request might come from port 82.
This leads to to create an incorrect url 'http://localhost:82/Blah/Bar' and I get a 400, bad hostname error.
Following the info in this post http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/9142db8d-0f85-47a2-91f7-418bb5a0c675/ I found that I could get the correct host and port number using HttpContext.Request.Headers["Host"].
But I can only pass a host-name to Url.Action, if I try passing the host-name and port then it still appends what it thinks is the right port so I end up with localhost:81:82.
EDIT: I found someone with the same problem. They seem to have gathered the same information I have (except they've included a reproduction too) but they don't have a useful fix as I can't specify the port number manually.
http://social.msdn.microsoft.com/Forums/en-US/windowsazuredevelopment/thread/87c729e8-094c-4578-b9d1-9c8ff7311577/
I suppose one fix would be to make my own Url.Action overload that lets me specify the port.
发布评论
评论(3)
对于来到这里的每个实际上需要绝对路径并且支持负载平衡系统的人,这就是我想到的:
然后,来自 https://github.com/aarnott/dotnetopenid/blob/v3.4/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs 通过 http://go4answers.webhost4life.com/Example/azure-messing-port-numbers-creates-28516.aspx
For everyone coming here who actually NEEDS an absolute path and are behind a load balanced system, here's what I came up with:
And then, from https://github.com/aarnott/dotnetopenid/blob/v3.4/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs via http://go4answers.webhost4life.com/Example/azure-messing-port-numbers-creates-28516.aspx
如果你只使用 Url.Action("Action", "Controller") 会发生什么?这应该只是生成一个相对 URL,它应该可以工作。
(或者也许更好的问题是:你为什么不使用那个重载?)
What happens if you just use Url.Action("Action", "Controller")? That should just generate a relative URL, which should work.
(Or perhaps a better question is: why aren't you using that overload?)
我发现这对我有用......
I found this worked for me...