У нас есть несколько старых веб-сервисов ASMX, которые были перемещены за пределы дополнительных уровней безопасности. WSDL - это автоматически генерируемая среда выполнения, которая теперь использует IP-адрес сервера, на котором работает, вместо общедоступного DNS. Как вы меняете IP с общедоступного DNS через код или web.config?
Веб-сервис предлагает как SOAP через HTTP POST / GET со строками запроса, так и более распространенный сценарий - SOAP через HTTP POST с телом SOAP-запроса. Я хочу переключить локальный IP с публичным DNS-именем сгенерированного WSDL во время выполнения. Мне удалось сделать это в обычном сценарии с использованием SoapExtensionReflector, но он не работает для портов WSDL, использующих строки запросов.
Упрощенная версия SoapExtensionReflector выглядит следующим образом:
public class MySoapExtensionReflector : SoapExtensionReflector
{
public override void ReflectDescription()
{
var description = ReflectionContext.ServiceDescription;
foreach (Service service in description.Services)
{
foreach (Port port in service.Ports)
{
foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
{
SoapAddressBinding binding = extension as SoapAddressBinding;
if (null != binding)
{
binding.Location = Regex.Replace(binding.Location,
"http://localhost:2017",
"https://example.com");
}
}
}
}
}
public override void ReflectMethod()
{
// No implementation
}
}
Соответствующие части web.config:
<system.web>
<webServices>
<soapExtensionReflectorTypes>
<add type="MyService.MySoapExtensionReflector, MyService"/>
</soapExtensionReflectorTypes>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
Это дает следующий результат в WSDL:
<wsdl:service name="MyService">
<wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
<soap:address location="https://example.com/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceSoap12" binding="tns:MyServiceSoap12">
<soap12:address location="https://example.com/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceHttpGet" binding="tns:MyServiceHttpGet">
<http:address location="http://localhost:2017/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceHttpPost" binding="tns:MyServiceHttpPost">
<http:address location="http://localhost:2017/Myservice.asmx"/>
</wsdl:port>
</wsdl:service>
Что не совсем желаемый результат. Два последних порта генерируются протоколом - определения HttpPost и HttpGet в web.config.
Как вы можете изменить это, чтобы у WSDL-портов было желаемое имя хоста?
Результат должен выглядеть следующим образом:
<wsdl:service name="MyService">
<wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
<soap:address location="https://example.com/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceSoap12" binding="tns:MyServiceSoap12">
<soap12:address location="https://example.com/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceHttpGet" binding="tns:MyServiceHttpGet">
<http:address location="http://example.com/Myservice.asmx"/>
</wsdl:port>
<wsdl:port name="MyServiceHttpPost" binding="tns:MyServiceHttpPost">
<http:address location="http://example.com/Myservice.asmx"/>
</wsdl:port>
</wsdl:service>