Что выбрать? Веб-сервис ASMX или WCF в .net 3.5?

Текущий проект я продолжаю работать, экстенсивно использует веб-сервисы и сделан в .net 3.5. Теперь когда мы идем для реализации второй фазы, мы смущены, если мы должны или использовать WCF или веб-сервис, как сделано ранее? Далее есть ли что-либо новое, которое может быть полезным и придумывает .net 4.0 относительно веб-сервисов или WCF.

12
задан John Saunders 4 May 2011 в 00:39
поделиться

5 ответов

Мы только что закончили совершенно новый проект, используя WCF вместо веб-сервисов ASMX в первый раз. Мы очень довольны результатами, но знаем, что была крутая кривая обучения. Несмотря на это, мы чрезвычайно довольны общими результатами и знаем, что это основание для всего, что Microsoft делает, идет вперед, и это было полностью стоят боли - бородавки и все.

Быстрые льготы, которые мы получили через ASMX :

1) для внутренних (за брандмауэром) сервисными звонками, мы используем Net: TCP-привязка, которая намного быстрее, чем мыло

2) мы Включено как конечная точка Net: TCP и конечная точка «Web» на той же службе с только обновлением файла конфигурации (никаких изменений кода)

3) мы смогли создать AJAX, поддерживающие retful Web Services с только изменениями и использованием только изменений DataContractjsonserializer, который уже встроен. Чтобы сделать это в противном случае, нам пришлось бы написать HTTP-обработчик (Ashx) и обрабатывать большую часть сериализации JSON и URL-анализа вручную.

4) Поскольку наш сайт необходимо масштабировать для оптимизации производительности и стабильности, мы смотрим преобразование к использованию структуры обмена сообщениями на основе MSMQ, которая является асинхронной и гарантированной и участвует в транзакциях; WCF предоставляет Bindng MSMQ, который требует от изменений в наших службах, не изменяющую в наших сервисах - просто ссылаться на обновления и настройку MSMQ должным образом с существующими сервисами (и добавление атрибутов для транзакционных границ).

Но быть предупрежденным: Действительно инвестируйте в изучение этого (купите синюю книгу о-дворных двор и пройдите через нее). Есть такие вещи, как аргумент-имени - изменения во время разработки, которые на самом деле не нарушают ссылки на обслуживание, а приводят к передаче нулевых аргументов (встроенная версия для обработки перекосов), моделями для хостинга для рассмотрения (Windows Service vs. IIS), а также создание наблюдения (Windows Service vs. Модели и неисправности для всех действительно понимают. Мы не ходили, и у нас были боли. Но мы вспахались вперед и очень довольны нашими учамими, и возможностями гибкости и роста, которые нам больше не привязаны к ASMX!

26
ответ дан 2 December 2019 в 03:10
поделиться

Это на самом деле не является ответом на ваш вопрос, но просто исследуя проблему дальше. Мне было интересно, имеет ли компилятор проблемы с видом , объявленные в прилагаемом объеме, поэтому попробовал это:

#include <iostream>

template <typename Func>
void do_test(Func pFunc) {
}

template <typename T>
void test_trait(void) {
   class Something { public: int foo; };

   do_test ([] (T pX) {
      Something A; A.foo = 12;
   });
}

int main(void) {
    test_trait<int> ();
}

здесь, я просто пытаюсь создать локальный тип в прилагаемом объеме и использовать его изнутри лямбда. Это не только не только компилярует (с Visual Studio 2010, Beta 2), но он фактически выбивает компилятор с внутренней ошибкой C1001.

-121--2831547-

Существуют разные точки, чтобы рассмотреть вопрос, прежде чем прыгать на WCF:

  1. WCF - это архитектурно более надежный и способствует передовым опытам.
  2. Если вы знаете, что вы делаете «шелковистым гладким», если вы не находитесь для поездка.
  3. У вас есть достаточно времени, чтобы завершить преобразование ваших услуг?

Наконец я бы сказал, что если у вас есть время, блен и мышцы, чтобы сделать обновление. Это стоит того. Если ASMX удовлетворит все потребности, вы можете сохраняться с веб-сервисами.

3
ответ дан 2 December 2019 в 03:10
поделиться

Два дополнительных аспекта:

  1. Независимо от того, как вы решите это для сервера, вы можете легко потреблять веб-сервисы и услуги WCF, используя только WCF на стороне клиента. Это имеет значение, если вы потребляете несколько услуг одним клиентом.

  2. Вы просили предстоящие темы. Если вы рассматриваете облачные вычисления: можно разместить услуги WCF в Windows Azure.

3
ответ дан 2 December 2019 в 03:10
поделиться

с WCF или ASMX убедитесь, что вы добавляете свои сервисы на свои страницы с помощью тега ASP: ScriptManager. Для вас будет создан JavaScript Proxies для вас, и это преимущество в том, что вам не нужно вообще разбираться, независимо от базового протокола. Это очень, очень мило. Этот пример является ASMX, но это каждый бит чистый, как с использованием WCF.

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebServices/Admin/HospitalLocationService.asmx" InlineScript="true" />
    </Services>
</asp:ScriptManager>

Кроме того, вы можете сделать ASMX отправлять JSON, добавив атрибуты ScriptService и ScriptMethod:

<System.Web.Services.WebService(Namespace:="http://www.fujimed.com/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
<ScriptService()> _
Public Class HospitalLocationService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    <ScriptMethod()> _
    Public Function GetAll() As List(Of HospitalLocationEntity)
        Return (New HospitalLocation()).GetAll().Data
    End Function

    <WebMethod()> _
    <ScriptMethod()> _
    Public Function GetByID(ByVal ID As Integer) As HospitalLocationEntity
        Return (New HospitalLocation()).GetHospitalLocation(ID).Data
    End Function

End Class

Отрещающая службу без анализа (это то, что делает для вас ScriptManager):

 function editLocation(id) {
    vRIS.HospitalLocationService.GetByID(id, getComplete, getError);
 }

 function getComplete(results, context, methodName) {
    document.all['txtLocation'].value = results.Location;
    document.all['txtInterfaceID'].value = results.InterfaceID;
    document.all['selActive'].value = results.Active ? "true" : "false";
    document.all['hdnLocationID'].value = results.ID.toString();
 }

 function getError(errorInfo, context, methodName) {
    Alert(methodName + " : " + errorInfo);
    document.all['txtLocation'].value = "";
    document.all['txtInterfaceID'].value = "";
    document.all['selActive'].value = "false";
    document.all['hdnLocationID'].value = "";
 }

отредактировано для добавления: со всеми вышеуказанными Основываясь на ASMX, я бы все еще прошел WCF, для универсальности и способности определять контракты данных. Также расследуйте услуги WCF RIA; Они нацеливаются на поддержку AJAX, а также Silverlight, и он автоматизирует большую часть конфигурации WCF.

3
ответ дан 2 December 2019 в 03:10
поделиться

ASMX отлично и просто - но он очень ограничен во многих отношениях:

  • Вы можете провести только ваши веб-сервисы в IIS
  • , вы можете только добраться до ваших веб-сервисов по адресу http
  • Безопасность очень ограничена

WCF устраняет это - и предложить гораздо больше за пределы этого. Вы можете принять свои услуги WCF в IIS - или самоуверенно в приложении консоли или выиграть службу NT, как нужно быть. Вы можете подключить ваши услуги WCF, используя HTTP, TCP / IP, MSMQ, одноранговые протоколы, названные трубы для наматывающихся коммуникаций и многое другое.

Я бы определенно рекомендую Вы идете с WCF. Это более сложный, чем ASMX, но он также предлагает просто ооочень гораздо больше возможностей и вариантов!

Что касается ресурсов: есть Центр разработчика MSDN WCF , который имеет все от учебных пособий для начинающих к статьям и примером кода.

Кроме того, я бы порекомендовал, чтобы вы посмотрели на Pluralsight Screen Chasts на WCF - это отличная серия, идущая от «, создавая вашу первую службу WCF » и « Создание вашего первого клиента WCF «Всю путь к довольно продвинутым темам. Aaron Skonnard Очень красиво объясняет все в 10-15 минут скринкасты - настоятельно рекомендуется!

11
ответ дан 2 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: