wcf - wsdl меняет тип порта и привязку - PullRequest
0 голосов
/ 06 октября 2011

Я новичок в wcf и пытаюсь создать веб-сервис из предоставленного клиентом wsdl;У меня возникли проблемы при изменении некоторых wcf-сгенерированных записей wsdl в соответствии с предоставленным wsdl.Я нашел это: WSDL-первый подход: как задать разные имена для wsdl: port и wsdl: binding? , который точно описывает проблему, с которой я столкнулся, но решение при условии, что оно не работает в Visual Studio 2010с .NET 4.0.

Вот веб-конфигурация:

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

И пользовательский класс:

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

Он компилируется нормально (у меня есть предупреждение веб-конфигурациипоговорка Элемент 'поведение' имеет недопустимый дочерний элемент 'portName'. Список возможных ожидаемых элементов: 'clientVia, callbackDebug, callbackTimeouts, clear, clientCredentials, transactedBatching, dataContractSerializer, dispatcherSynchronization, remove, synchronousReceive, enableWebScript, webHttp, endpointDiscoverysoapProcessing ', который, похоже, связан с ошибкой в ​​VS)

Сгенерированный wsdl по-прежнему показывает wsdl: port name = "BasicHttpBinding_IService1" binding = "tns: BasicHttpBinding_IService1">', а не измененное имя порта.

Вы можете найти весь тестовый проект здесь: http://dl.dropbox.com/u/13875536/CustomWsdlExtension.zip Заранее спасибо.

1 Ответ

0 голосов
/ 06 октября 2011

Он не работает, потому что ваш web.config не отражает ваш сервис и контракт, поэтому конфигурация вообще не используется.

Эта часть неверна:

<services>
  <service name="CustomWsdlExtension.Service" ... >
    <endpoint contract="CustomWsdlExtension.IService" ... />
    ... 
  </service>
</services>

Он должен использовать полное название вашего класса обслуживания и контракта на обслуживание. Вы просто скопировали конфигурацию из связанного ответа - этого недостаточно. Конфигурация должна соответствовать вашим классам:

<services>
  <service name="CustomWsdlExtension.Service1" ... >
    <endpoint contract="CustomWsdlExtension.IService1" ... />
    ... 
  </service>
</services>

Также предыдущий ответ не показывает, как изменить имя привязки. Специального кодирования для этого не существует. Для этого Endpoint элемент в конфигурации имеет атрибуты bindingName и bindingNamespace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...