Стоит задача — в 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 ничего полезного не подсказал, как и гугл с яндексом.
Всем заранее спасибо за попытку помочь.