如何从非标准端口使用.NET Web服务?

时间:2009-03-12 21:52:05

标签: .net visual-studio-2008 web-services

我们的Web服务是通过路由器访问的,该路由器使用端口转发连接到实际的Web服务器。当我们尝试在Visual Studio中建立Web引用时,似乎.NET框架将带有端口的完整URL返回到Visual Studio,以便在发现期间进行引用。然后,Visual Studio尝试建立与该Web服务的连接以创建代理对象(或其他任何对象)并被拒绝,因为我们不允许在该非标准端口上进行访问。

原始网络服务网址

http://webservices.example.com/SomeService.asmx

从路由器返回的Web服务URL

http://webservices.example.com:25001/SomeService.asmx

我的问题是,如果您知道在从发现调用返回URL时如何使.NET框架不包含端口。这是一个描述这个过程的图表:

diagram

1 个答案:

答案 0 :(得分:1)

这可能会起到作用:

  

Manually setting soap:address in ASMX

以下是链接死亡时的代码段:

using System.Configuration;
using System.Web.Services.Description;

namespace Thinktecture.Tools.Web.Services.Metadata
{
  public class SoapAddressReflector : SoapExtensionReflector
  {
    public override void ReflectMethod()
    {
      ServiceDescription sd = ReflectionContext.ServiceDescription;

      foreach (Service service in sd.Services)
      {
        foreach (Port port in service.Ports)
        {
          foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
          {
            if (extension is SoapAddressBinding)
            {
              SoapAddressBinding address = (SoapAddressBinding)extension;

              // Set the address here:
              address.Location = ConfigurationManager.AppSettings["SoapAddress"];
            }
          }
        }
      }
    }
  }
}

配置:

<configuration>
 <appSettings>
  <add key="SoapAddress" value="http://www.thinktecture.com/Test/"/>
 </appSettings>

 <system.web>
  <webServices>
    <soapExtensionReflectorTypes>
      <add type="Thinktecture.Tools.Web.Services.Metadata.SoapAddressReflector, SoapAddressReflector"/>
    </soapExtensionReflectorTypes>
  </webServices>
 </system.web>
</configuration>

<强>更新

上述技术似乎工作正常,但如果您有多个服务,则会有一些限制。您还需要在完全信任中运行,因此在部分信任环境中执行此操作不会起作用。

除了使用SoapExtensionReflector之外,我不确定是否还有其他魔术配置开关或属性可以实现。在一个好的Google之后,所有结果都指向SoapExtensionReflector方法。

但是怎么样?如果Web服务没有经常更改,您可以获取生成的WDSL的副本,编辑SOAP / HTTP绑定,然后将其作为静态XML文件自行发布?