一般而言webservice是部署在哪台服务器,然后它的address location就是指向哪个,但是由于有些情况处于各种原因,如网络策略,需要先访问某个ip之后再进行跳转到一个ip,这个时候就需要代码控制websevice指向的IP地址了,就需要用到SoapExtensionReflector类了,重写里面的ReflectDescription方法:如下
public override void ReflectDescription()
{
ServiceDescription description = ReflectionContext.ServiceDescription;
{
ServiceDescription description = ReflectionContext.ServiceDescription;
foreach (Service service in description.Services)
{
foreach (Port port in service.Ports)
{
foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
{
try
{
SoapAddressBinding binding = extension as SoapAddressBinding;
{
foreach (Port port in service.Ports)
{
foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
{
try
{
SoapAddressBinding binding = extension as SoapAddressBinding;
string path = "http://1.1.1.1"; // 需要访问的地址
{
string url = binding.Location;// 例如:http://localhost:8090/WebService/codes/new
//假如你websevice部署再2.2.2.2这台服务器,那么就将这个ip替换为你需要访问的ip,同时你也可以根据binding.Location来判断哪个服务需要替换。
binding.Location = binding.Location.Replace("http://2.2.2.2", path);
}
}
catch (Exception ex)
{
string url = binding.Location;// 例如:http://localhost:8090/WebService/codes/new
//假如你websevice部署再2.2.2.2这台服务器,那么就将这个ip替换为你需要访问的ip,同时你也可以根据binding.Location来判断哪个服务需要替换。
binding.Location = binding.Location.Replace("http://2.2.2.2", path);
}
}
catch (Exception ex)
{
}
}
}
}
}
}
}
}
}
然后在web.config配置里configuration节点里加上如下节点
<system.web>
<webServices>
<protocols>
<add name="HttpSoap"/>
</protocols>
<soapExtensionReflectorTypes>
<add type ="类名,该类所在文件夹"/>
</soapExtensionReflectorTypes>
</webServices>
</system.web>
注意:一但使用,则所有webservice将使用会执行这个程序