Подмены в разделе <wsdl:port> в WSDL файле веб-сервиса
От: AlexNiden  
Дата: 28.04.08 15:57
Оценка:
Стоит задача — в WSDL-файле для веб-сервиса подменять <location> в разделе <ports>. Для этого написан класс, производный от SoapExtensionReflector. Однако он с задачей справляется не целиком.

Web.config:
            <protocols>
                <add name="HttpSoap"/>
                <add name="HttpGet"/>
                <add name="HttpPost"/>
                <add name="HttpSoap12"/>
            </protocols>


Класс, который должен производить подмену

    internal class ReflectorExtension : 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 ) {
                        var address = (SoapAddressBinding) extension;
                        var uri = new Uri( address.Location );
                        string[] segments = uri.Segments;
                        address.Location = ConfigurationManager.AppSettings["WebService.SoapAddress"] + segments[segments.Length - 1];
                    }
                }
            }
        }
    }


WSDL, получаемый в результате
<wsdl:service name="MC">
    <wsdl:port name="MCSoap" binding="tns:MCSoap">
              <soap:address location="http://spb-chrisk/WebService2/MC.asmx"/>
        </wsdl:port>
    <wsdl:port name="MCSoap12" binding="tns:MCSoap12">
              <soap12:address location="http://spb-chrisk/WebService2/MC.asmx"/>
        </wsdl:port>
    <wsdl:port name="MCHttpGet" binding="tns:MCHttpGet">
              <http:address location="http://localhost/MC.asmx"/>
        </wsdl:port>
    <wsdl:port name="MCHttpPost" binding="tns:MCHttpPost">
              <http:address location="http://localhost/MC.asmx"/>
        </wsdl:port>
</wsdl:service>


Полужирным я выделил ссылки, по которым не произошло подмены — там указан адрес на localhost, в то время как в первых двух ссылках подмена происходит. Соотвественно, там, где используется SOAP — все работает, а вот для GET/POST — нет. Куда копать? MSDN ничего полезного не подсказал, как и гугл с яндексом.

Всем заранее спасибо за попытку помочь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.