wcf - wsdl ändern Sie den port-Typ und-Bindung
Ich bin neu in wcf und versuchen, erstellen Sie einen webservice von einem client bereitgestellte wsdl; ich habe Probleme beim ändern einiger wcf generierten wsdl-Einträge entsprechend der bereitgestellten wsdl. Ich fand diese: WSDL-first-Ansatz: so geben Sie unterschiedliche Namen für die wsdl:port und wsdl:binding?
was genau beschreibt das Problem, das ich habe aber die Lösung, vorausgesetzt, es funktioniert nicht in Visual Studio 2010 mit .NET 4.0.
Hier ist die web-config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0">
</compilation>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="portName" type="CustomWsdlExtension.PortNameWsdlBehaviorExtension, CustomWsdlExtension, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
<services>
<service name="CustomWsdlExtension.Service" behaviorConfiguration="MyBehavior">
<endpoint address="" binding="basicHttpBinding" contract="CustomWsdlExtension.IService" behaviorConfiguration="customPortName"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="customPortName">
<portName name="myCustomName"/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
Und die benutzerdefinierte Klasse:
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 };
}
}
}
Kompiliert ok (ich habe eine Warnung, web-config sagen Das element 'Verhalten' hat eine ungültige untergeordnete element 'portName'. Liste der möglichen Elemente erwartet: 'clientVia, callbackDebug, callbackTimeouts, klar, clientCredentials, transactedBatching, dataContractSerializer, dispatcherSynchronization, entfernen, synchronousReceive, enableWebScript, webHttp, endpointDiscovery, soapProcessing' scheint sich um einen bug in VS)
Die generierte wsdl-noch zeigt wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1">', anstatt die geänderte port-name.
Finden Sie die gesamte test-Projekt hier: http://dl.dropbox.com/u/13875536/CustomWsdlExtension.zip
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es funktioniert nicht, weil dein web.config nicht entsprechend Ihren service und Vertrag, so dass die Konfiguration gar nicht genutzt.
Dieser Teil ist falsch:
Muss vollständigen Namen des service-Klasse und die service-Vertrag. Die Sie gerade kopiert Konfiguration von verlinkten Antwort - es ist nicht genug. Muss die Konfiguration passen Sie Ihre Klassen verwendet werden:
Auch die Vorherige Antwort nicht gezeigt, wie man die Bindung name. Es gibt keine spezielle Codierung für das.
Endpoint
element in der KonfigurationbindingName
undbindingNamespace
Attribute für diesen Zweck.<wsdl:port name="myCustomName" binding="tns:MyCustomBindingName_IService1">
eher als<wsdl:port name="myCustomName" binding="tns:MyCustomBindingName">
. Irgendwelche Ideen? Nochmals vielen Dank.