Скрыть конечную точку REST от MEX / WSDL в WCF - PullRequest
6 голосов
/ 02 марта 2010

У меня есть служба WCF, у которой есть конечные точки REST и SOAP для каждой службы. Это было реализовано аналогично этому сообщению: Конечные точки REST / SOAP для службы WCF с конфигурацией, подобной следующей:

<services>
  <service name="TestService">
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="rest" binding="webHttpBinding" contract="ITestService"/>
  </service>
</services>

Проблема в том, что конечная точка REST отображается в результирующем WSDL в качестве дополнительного порта и привязки.

Есть ли способ предотвратить включение конечной точки REST в WSDL?

Ответы [ 3 ]

1 голос
/ 19 октября 2010

Было бы хорошо, если бы существовал атрибут для украшения конечной точки, чтобы он был скрыт от генерации mex / wsdl в будущих версиях WCF именно по этой причине (скрывая отдыхающие службы от мыльных клиентов).

1 голос
/ 16 марта 2011

Нашел приличный способ сделать это, используя IWsdlExportExtension. Вероятно, есть более надежный / повторно используемый способ сделать это, но это решение требует, чтобы соглашение всех конечных точек REST было названо "REST". Ниже приведена соответствующая часть поведения конечной точки, прикрепленной ко всем конечным точкам REST:

public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
{
    // Remove all REST references (binding & port) from SOAP WSDL
    foreach (ServiceDescription wsdl in exporter.GeneratedWsdlDocuments)
    {
        // Remove REST bindings
        foreach (Binding binding in wsdl.Bindings)
        {
            if (binding.Name == "REST")
            {
                wsdl.Bindings.Remove(binding);
                break;
            }
        }

        // Remove REST ports
        foreach (Service service in wsdl.Services)
        {
            foreach (Port port in service.Ports)
            {
                if (port.Name == "REST")
                {
                    service.Ports.Remove(port);
                    break;
                }
            }
        }
    }  
}
1 голос
/ 02 марта 2010

Вы можете получить копию WSDL, отредактировать ее вручную, чтобы удалить нежелательные артефакты, и сохранить ее в известном месте. Получив версию WSDL, которая удаляет нежелательные артефакты, вы можете перенаправить запрос? Wsdl в это место:

<behaviors>
 <serviceBehaviors>
    <behavior name="TestServiceBehavior">
     <serviceMetadata httpGetEnabled="True" externalMetadataLocation="http://localhost/TestService.wsdl"/>
    </behavior>
 </serviceBehaviors>
</behaviors>

Пара предостережений об этом решении. Вы должны быть осторожны с тем, что редактируете. Если вы измените критические аспекты контракта, WCF не сможет обрабатывать сообщения от клиентов, сгенерированных из него. Удаление конечной точки обычно не имеет большого значения, однако изменение имен для привязок, операций, типов сообщений и т. Д. Может вызвать проблемы.

Вам также необходимо знать об импорте. WSDL, сгенерированный WCF, обычно определяет конечные точки, а затем импортирует другой .wsdl, который определяет фактический контракт на обслуживание. Сервисный контракт wsdl in tern обычно импортирует несколько файлов .xsd, которые определяют ваше сообщение и типы данных. Вам необходимо убедиться, что у вас есть копии этих загруженных файлов относительно корня .wsdl, и что вы обновляете элементы импорта, чтобы ссылаться на них соответствующим образом.

Еще одна проблема, связанная с этим, заключается в том, что вы теперь вручную контролируете свой контракт ... что означает, что если вы его измените, вам придется снова его редактировать и заменять на любом сайте, где вы размещаете файл .wsdl. Теперь правильно разработанный контракт НИКОГДА не должен изменяться, поскольку это нарушает одно из фундаментальных правил SOA в отношении веб-сервисов. Тем не менее, похоже, что вы занимаетесь разработкой кода, так что об этом нужно знать.

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