Подтвердить что ты не робот

Visual Studio/SOAP - "Добавить ссылку на службы" и "Добавить ссылку на веб-службу"

Я обнаружил, что могу импортировать сервис SOAP/WSDL, который планирую использовать в своем решении, либо в качестве "Справочника веб-службы" (System.Web.Services), либо как "Service Reference" (System.ServiceModel/WCF).

Мне было интересно, каковы были различия. Я понимаю, что "Добавить Service Reference" /WCF новее, есть ли какие-либо недостатки в использовании его по сравнению с System.Web.Services или теперь это предпочтительный способ использования SOAP-сервисов в .NET?

4b9b3361

Ответ 1

Предпочтительным и наиболее полезным способом является использование Add Service Reference. Это добавит вашу службу в качестве прокси-сервера на стороне клиента WCF.

Add Web Reference является "старым" способом ASMX/ASP.NET для веб-сервисов.

WCF - гораздо лучший выбор, чем ASMX, потому что:

  • он более новый и будет поддерживаться в будущем (ASMX уже на выходе); если вы узнаете это сейчас, вам не придется изучать его позже, когда ASMX определенно ушел.
  • он обеспечивает гораздо большую гибкость во всех аспектах.
  • Вы можете использовать только службу ASMX только IIS, используя HTTP в качестве своего протокола; WCF может быть размещен в IIS; самостоятельное размещение в службе Windows NT; WCF может использовать HTTP, NetTCP, MSMQ и многие другие протоколы.
  • WCF предлагает гораздо больше безопасности и других настроек, что делает его гораздо более мощным для использования

Да, WCF имеет плохой рэп о том, чтобы быть очень трудным для изучения - я действительно не считаю, что это правда. Проверьте эти ресурсы для начинающих - очень полезно!

Ответ 2

У меня есть приложение, которое вызывает существующую службу SOAP, написанную на J2EE и размещенную в WebSphere.

Я создал два консольных приложения - один из которых ссылается на службу как на старую школьную веб-службу, а другую, ссылающуюся на нее как на ссылку службы.

В обоих случаях Visual Studio создает класс прокси и соответствующие записи конфигурации для службы.

В приложении консоли Service Reference я получаю гораздо больше параметров конфигурации, которых я не вижу в приложении веб-службы. В частности, я могу установить максимальный размер сообщения и т.д.

На самом деле, чтобы заставить консольное приложение Service Reference работать правильно, мне пришлось увеличить размер сообщения по умолчанию, чтобы вернуть все данные, отправленные одним из вызовов метода.

Вот как выглядит конфигурация в приложении Service Reference:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="ClaimSoapBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536000" maxBufferPoolSize="524288" maxReceivedMessageSize="65536000"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://urlgoeshere/ClaimService"
                binding="basicHttpBinding" bindingConfiguration="ClaimSoapBinding"
                contract="ClaimService.Claim" name="ClaimService" />
        </client>
    </system.serviceModel>
</configuration>

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

<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ServiceTesterOldSchool.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <ServiceTesterOldSchool.Properties.Settings>
            <setting name="ServiceTesterOldSchool_ClaimService_ClaimService"
                serializeAs="String">
                <value>http://urlgoeshere/ClaimService</value>
            </setting>
        </ServiceTesterOldSchool.Properties.Settings>
    </applicationSettings>
</configuration>

Это намного проще, но не хватает многих вариантов, которые мы получаем с помощью ссылок на службы.

Фактический код, вызывающий службу, почти идентичен в обоих случаях.

Чтобы ответить на ваш вопрос, я думаю, что важно придерживаться нынешнего способа делать что-то. Microsoft делает это ясно, заставляя вас пройти несколько уровней диалогов, прежде чем вы сможете даже добавить старую школьную веб-ссылку (по крайней мере, на VS2008).

Я думаю, что способ WCF более гибкий, и конфигурация намного более описательна в отношении того, что происходит.

Кроме того, по мере добавления новых компонентов WCF в ваши приложения, будет удобно сохранять ваши настройки конфигурации согласованными, вместо того, чтобы смешивать и сопоставлять между старой школой и WCF.

Ответ 3

Я думаю, что одно из отличий заключается в автогенерированном прокси-коде для службы. Если вы перейдете с ссылкой на службу, ваше приложение будет требовать, чтобы уровень WCF связывался. Это вообще не проблема, но если вы пишете код, который будет запускаться на других платформах (например, Mono), вам нужно будет использовать ссылку на веб-службу (поскольку Mono еще не поддерживает WCF.)