我有一个包含一些ASMX Web服务的ASP.NET WebApp。我们最近迁移到从Windows 2003服务器加载平衡的Windows 2008服务器。新的服务器位于一些F5设备后面,用于负载平衡(这就是我所知道的!)。
我们可以访问内置的ASP.NET POST测试(例如:http://webapp.company.com/webservices/Person.asmx?op=GetPerson)但是从该测试页面调用它失败(页面不可用)。浏览器中的新选项卡将打开,其中包含相同的URL,但末尾附加了端口号:http://webapp.company.com:50831/webservices/Person.asmx?op=GetPerson。当我将该URL(带端口)放入浏览器时,它也会失败。哎,http://webapp.company.com:50831根本无法到达。
我们之前的服务器上没有这个功能。我在个人Windows 2012服务器上设置了我自己的个人网络服务器,并在那里测试了相同的代码并且它有效。所以我认为它与负载平衡有关。
不幸的是,我无法控制我们公司为托管内部应用程序提供的Web服务器。我也无法触摸IIS。我得到的只是将文件发布到的文件路径。托管组织告诉我我的ASP.NET WebApp代码附加了端口号,但我认为没错。它只发生在那些负载平衡的服务器上!
在调用在F5设备后面托管的ASMX或WCF之前,有没有其他人遇到此问题?
答案 0 :(得分:0)
维护这些服务器的IT小组对我们没有任何答案,但我们能够验证这些奇怪的端口实际上是由F5设备分配的。我们最终使用端口重写器作为解决方法,直到维护Web服务器的组可以更改配置。我们使用的代码如下所示,直接来自下面的URL,他们在同一个F5设备(BigIP)背后讨论相同的问题。
http://www.justskins.com/forums/port-mapping-a-web-51075.html
public class WSDLAddress : SoapExtensionReflector
{
bool bFirstTime = true;
public override void ReflectMethod()
{
if (!bFirstTime) return;
bFirstTime = false;
SoapAddressBinding sabAddress = ReflectionContext.Port.Extensions.Find(typeof(SoapAddressBinding)) as SoapAddressBinding;
string sPort = ConfigurationSettings.AppSettings["myPort"];
UriBuilder uriLocation = new UriBuilder(sabAddress.Location);
uriLocation.Port = Int32.Parse(sPort);
sabAddress.Location = uriLocation.Uri.AbsoluteUri;
}
}