Web服务(asmx)POST测试在特定负载平衡服务器上失败

时间:2014-07-08 22:50:47

标签: asp.net web-services asmx load-balancing f5

我有一个包含一些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之前,有没有其他人遇到此问题?

1 个答案:

答案 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;
    }
  }