2011-01-16 12 views
12

Ich folge WSDL-first (von unserem Kunden) Ansatz für die Entwicklung WCF-Service, aber WSDLs generiert von meinem WCF-Service ist etwas anders als WSDL von meinem Kunden zur Verfügung gestellt und aufgrund dieser Mismatch, hat der Kunde Schwierigkeiten zu machen Ruf zu meinem Dienst an.WSDL-first Ansatz: Wie verschiedene Namen für wsdl angeben: Port und WSDL: Bindung?

Auftraggeber zur Verfügung gestellten wsdl:

<wsdl:service name='CheckoutService'> <wsdl:port binding='tns:CheckoutBinding' name='CheckoutServicePort'> <soap:address location='place holder to service uri' /> </wsdl:port> </wsdl:service>


WSDL erzeugt von Wcf-Dienst:

<wsdl:service name="CheckoutService"> <wsdl:port binding="tns:CheckoutBinding" name="CheckoutBinging"> <soap:address location="place holder to service uri" /> </wsdl:port> </wsdl:service>

und sind meine Service-Einstellungen wie folgt:

<endpoint name="CheckoutBinding" address="" binding="basicHttpBinding" bindingName="CheckoutServicePort" bindingConfiguration="basicHttpBinding" bindingNamespace="<<namespace>>" contract="<<contractname>>" />

Ich habe WSCF.Blue zum Erzeugen von Server-Stub-Code aus dem Client zur Verfügung gestellt Wsdl und machte kleinere Änderungen im generierten Code verwendet zu emittieren WSDL genau dieselbe wie die von Kunden zur Verfügung gestellt, aber ich bin immer noch keine Idee über welche Änderung in der Konfigurationsdatei oder im generierten Code vorgenommen werden soll, um den gleichen "wsdl: port/@ name" wie in der vom Client bereitgestellten wsdl-Datei zu erhalten.

Gemäß dieser url ist serviceendpoint name Eigenschaft zugeordnet wsdl: Port/@ Name und wsdl: binding/@ Name. Auf dieser Grundlage wird der Attributwert endpoint/@ name in meiner Konfigurationsdatei wsdl: port/@ name und wsdl: binding/@ name zugeordnet, aber ich möchte, dass andere Namen wsdl zugeordnet werden: port/@ name und wsdl: binding/@name-Attribute

Bitte helfen Sie mir dabei.

Antwort

17

Sie können versuchen, IWsdlExportExtension zu implementieren, und in ExportEndpoint ändern Sie wsdl: port/@ name. Implementieren Sie dann IEndpointBehavior, das Ihre Erweiterung zu einem Endpunkt hinzufügt. Um Ihr neues Verhalten zu verwenden, haben Sie zwei Möglichkeiten:

  • Verhalten von Code hinzufügen. Wenn der Dienst in IIS gehostet wird, müssen Sie einen benutzerdefinierten ServiceHost und ServiceHostFactory erstellen. Beim Self-Hosting können Sie Endpunkte einfach iterieren und Verhalten hinzufügen.
  • Verhalten von der Konfiguration hinzufügen. Sie müssen das benutzerdefinierte BehaviorExtensionElement implementieren, dieses Element registrieren und es in endpointBehaviors für Ihren Endpunkt verwenden. Hier

ist einfaches Beispiel mit Verlängerungselement:

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 }; 
     } 
    } 
} 

und Konfiguration:

<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> 

Meine WSDL dann wie folgt aussehen:

<wsdl:service name="Service"> 
    <wsdl:port name="myCustomName" binding="tns:BasicHttpBinding_IService"> 
     <soap:address location="http://localhost:2366/Service.svc" /> 
    </wsdl:port> 
</wsdl:service> 
+0

Vielen Dank für Ihre rechtzeitige Hilfe und Code. Es hat mein Problem gelöst. – Niranjan

+0

@ user577260 - Wenn Sie eine Antwort akzeptieren, geben Sie anderen einen schnellen visuellen Hinweis, dass Ihr Problem gelöst wurde. Sie erhalten auch einen +2 Wiederholungsbonus. – ChrisF

+0

Entschuldigung, für die verspätete Antwort. Ich habe es als beantwortet überprüft. – Niranjan