2011-01-16 26 views
12

Tôi đang theo WSDL-đầu tiên (cung cấp bởi khách hàng) để phát triển dịch vụ WCF nhưng WSDL được tạo từ dịch vụ wcf của tôi hơi khác với WSDL do khách hàng cung cấp và vì sự không khớp này, khách hàng đang gặp khó khăn để thực hiện gọi cho dịch vụ của tôi.Cách tiếp cận đầu tiên của WSDL: Cách chỉ định các tên khác nhau cho wsdl: port và wsdl: binding?

Khách hàng cung cấp 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 được tạo ra từ dịch vụ WCF:

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

và, cài đặt dịch vụ của tôi như sau:

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

Tôi đã sử dụng WSCF.Blue để tạo mã máy chủ từ khách hàng được cung cấp wsdl và thực hiện các thay đổi nhỏ trong mã được tạo để phát ra WSDL giống hệt như được cung cấp bởi khách hàng nhưng tôi không nhận được bất kỳ ý tưởng nào về những thay đổi cần thực hiện trong tệp cấu hình hoặc trong mã được tạo để nhận được cùng một "wsdl: port/@ name" giống như trong tệp wsdl do khách hàng cung cấp.

Theo điều này url, thuộc tính tên điểm dịch vụ được ánh xạ tới wsdl: port/@ name và wsdl: binding/@ name. Dựa trên điều này, giá trị thuộc tính endpoint/@ name trong tệp cấu hình của tôi được ánh xạ tới wsdl: port/@ name và wsdl: binding/@ name nhưng tôi muốn các tên khác nhau được ánh xạ tới wsdl: port/@ name và wsdl: binding/thuộc tính @name.

Vui lòng giúp tôi đạt được điều này.

Trả lời

17

Bạn có thể thử triển khai IWsdlExportExtension và trong ExportEndpoint sửa đổi wsdl: port/@ name. Sau đó triển khai IEndpointBehavior sẽ thêm phần mở rộng của bạn vào một điểm cuối. Để sử dụng hành vi mới của bạn, bạn có hai lựa chọn:

  • Thêm hành vi từ mã. Khi dịch vụ được lưu trữ trong IIS, bạn phải tạo ServiceHost và ServiceHostFactory tùy chỉnh. Trong tự lưu trữ, bạn chỉ có thể lặp lại thiết bị đầu cuối và thêm hành vi.
  • Thêm hành vi từ cấu hình. Bạn phải thực hiện tùy chỉnh BehaviorExtensionElement, đăng ký phần tử này và sử dụng nó trong endpointBehaviors liên quan đến điểm cuối của bạn.

Dưới đây là ví dụ đơn giản với phần mở rộng:

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

Và cấu hình:

<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 của tôi sau đó trông giống như:

<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

Cảm ơn bạn đã giúp đỡ kịp thời của bạn và mã. Nó giải quyết vấn đề của tôi. – Niranjan

+0

@ user577260 - bằng cách chấp nhận câu trả lời bạn đưa ra gợi ý trực quan cho người khác rằng vấn đề của bạn đã được giải quyết. Bạn cũng nhận được một +2 tiền thưởng đại diện. – ChrisF

+0

Xin lỗi, vì đã trả lời muộn. Tôi đã kiểm tra nó như đã trả lời. – Niranjan

Các vấn đề liên quan