我们的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框架不包含端口。这是一个描述这个过程的图表:
答案 0 :(得分:1)
这可能会起到作用:
以下是链接死亡时的代码段:
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文件自行发布?