Как изменить адрес порта WSDL веб-службы ASMX? - PullRequest
1 голос
/ 14 мая 2019

У нас есть несколько старых веб-сервисов 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>
...