Ответ 1
Вы можете попробовать реализовать IWsdlExportExtension и в ExportEndpoint изменить wsdl: port/@name. Затем реализуем IEndpointBehavior, который добавит ваше расширение к конечной точке. Чтобы использовать ваше новое поведение, у вас есть два варианта:
- Добавить поведение из кода. Когда служба размещена в IIS, вам необходимо создать пользовательские ServiceHost и ServiceHostFactory. В самообслуживании вы можете просто перебирать конечные точки и добавлять поведение.
- Добавить поведение из конфигурации. Вы должны реализовать пользовательский элемент BehaviorExtensionElement, зарегистрировать этот элемент и использовать его в endpointBehaviors, связанном с вашей конечной точкой.
Вот простой пример с элементом расширения:
using System;
using System.Configuration;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
namespace CustomWsdlExtension
{
public class PortNameWsdlBehavior : IWsdlExportExtension, IEndpointBehavior
{
public string Name { get; set; }
public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
{
}
public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
{
if (!string.IsNullOrEmpty(Name))
{
context.WsdlPort.Name = Name;
}
}
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
public class PortNameWsdlBehaviorExtension : BehaviorExtensionElement
{
[ConfigurationProperty("name")]
public string Name
{
get
{
object value = this["name"];
return value != null ? value.ToString() : string.Empty;
}
set { this["name"] = value; }
}
public override Type BehaviorType
{
get { return typeof(PortNameWsdlBehavior); }
}
protected override object CreateBehavior()
{
return new PortNameWsdlBehavior { Name = Name };
}
}
}
И конфигурация:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="portName" type="CustomWsdlExtension.PortNameWsdlBehaviorExtension, CustomWsdlExtension" />
</behaviorExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="customPortName">
<portName name="myCustomName" />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="CustomWsdlExtension.Service">
<endpoint address="" binding="basicHttpBinding" contract="CustomWsdlExtension.IService"
behaviorConfiguration="customPortName" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Мой WSDL выглядит следующим образом:
<wsdl:service name="Service">
<wsdl:port name="myCustomName" binding="tns:BasicHttpBinding_IService">
<soap:address location="http://localhost:2366/Service.svc" />
</wsdl:port>
</wsdl:service>