Visual Studio / SOAP - «Добавить ссылку на службу» против «Добавить ссылку на веб-службу» - PullRequest
17 голосов
/ 03 февраля 2010

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

Мне было интересно, в чем были различия. Я понимаю, что «Добавить ссылку на службу» / WCF является более новой, есть ли какие-либо недостатки в ее использовании по сравнению с System.Web.Services или сейчас это предпочтительный способ использования служб SOAP в .Net?

Ответы [ 3 ]

21 голосов
/ 03 февраля 2010

Предпочтительным и наиболее полезным способом действительно является использование 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 плохой рэп о том, что его действительно трудно выучить - я не считаю это правдой. Проверьте ресурсы для начинающих - очень полезно!

6 голосов
/ 03 февраля 2010

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

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

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

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

Фактически, чтобы приложение консоли 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>

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

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

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

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

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

3 голосов
/ 03 февраля 2010

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

...