Почему классический веб-сервис asp.net быстрее, чем wcf? - PullRequest
3 голосов
/ 19 ноября 2011

я создал 2 разных веб-сервиса. один из них - классический веб-сервис и веб-сервис wcf, также я разместил их на IIS. Я проверил на производительность через класс STOPWATCH. но классический веб-сервис в 2 или 3 раза быстрее !!! Что вы думаете об этом? Я гуглю и вижу статью, в которой говорится: «WCF предлагает лучшую производительность, примерно на 25% - 50% быстрее, чем веб-службы ASP.NET».

Классический веб-сервис



   [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public List < Customers>GetMyCustomers()
        {
            return new Customers().GetCustomers();
        }
    }

    public class Customers
    {
        private int id { get; set; }
        private string Name { get; set; }
        private string SurName { get; set; }

        public Customers()
        {
        }

        public List<Customers> GetCustomers()
        {
            return new List<Customers>(){ new Customers(){ id=1, Name="murat", SurName="xyzk"},
                                           new Customers(){  id=2, Name="ali", SurName="Yılmaz"}};
        }
    }

Мой сервис WCF и его веб-конфигурация ниже:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace WcfServiceLib
{
    [ServiceContract]
    public interface ICustomers
    {
        [OperationContract]
         List<Customers> GetCustomers();
    }
   [DataContract]
   public class Customers
    {
        public int id { get; set; }
        public string Name { get; set; }
        public string SurName { get; set; }
    }

   public class MyCustomers : ICustomers
   {

        public List<Customers> GetCustomers()
       {
           return new List<Customers>() { 
               new Customers() { id = 1, Name = "murat", SurName = "xyzk" }, 
               new Customers() { id = 2, Name = "ali", SurName = "Yılmaz" } };
       }
   }
}

Web.config:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
    <httpRuntime executionTimeout="999999" maxRequestLength="2097151"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfServiceLib.MyCustomers" behaviorConfiguration="CustomersBehavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://pc/WcfServiceLib/MyCustomers/" />
          </baseAddresses>
        </host>
        <endpoint address ="" binding="basicHttpBinding" contract="WcfServiceLib.ICustomers">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CustomersBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

Я использовал секундомер в консольном приложении для тестирования производительности: <pre> static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); klasikservis.Service1 srv = new klasikservis.Service1(); srv.GetMyCustomers(); int count = srv.GetMyCustomers().Count(); Console.WriteLine(count.ToString()); stopwatch.Stop(); Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); Console.Read(); stopwatch.Start(); WcfServis.CustomersClient WcfSrv = new WcfServis.CustomersClient(); count = WcfSrv.GetCustomers().Count(); Console.WriteLine(count.ToString()); stopwatch.Stop(); Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); Thread.Sleep(10000); Console.Read();</p> <pre><code> }

РЕЗУЛЬТАТ:

Классический веб-сервис ms: 00.6860078 веб-служба wcf ms: 1.0503

Но я вижу, что wcf знаний работает быстрее, чем веб-сервис asp.net: http://blogs.msdn.com/b/rickrain/archive/2009/07/15/asp-net-web-services-to-wcf-services-answering-the-question-why.aspx. это смущает меня. это какая-то хитрость или проблема? мне нужны твои идеи?

Ответы [ 3 ]

5 голосов
/ 19 ноября 2011

Ваш тест некорректен.Вы, вероятно, просто измеряете время прогрева, а не фактическую производительность.В WCF происходит намного больше, чем в ASMX, поэтому было бы разумно предположить, что у него будет больше времени на прогрев.первая пара сотен результатов.

5 голосов
/ 19 ноября 2011

Попробуйте запустить тест, при котором каждый веб-сервис вызывается 100 раз. Wcf имеет тенденцию к небольшим издержкам при первом вызове, но после его создания и выполнения все последующие вызовы выполняются намного быстрее. Если вы возьмете общее количество каждого, вы увидите увеличение скорости.

0 голосов
/ 20 ноября 2011

Если вы беспокоитесь о производительности, вам следует рассмотреть возможность использования моей инфраструктуры веб-служб с открытым исходным кодом ServiceStack . В тестах сервера .NET показано, что последовательно работает с другими библиотеками .NET. Он имеет самый быстрый текстовый сериализатор для .NET, включая .NET самый быстрый сериализатор JSON .

Мало того, что он намного быстрее, чем WCF, он также намного проще - тот же сервис в ServiceStack выглядит так:

public class MyCustomers : ServiceBase<Customers>
{
    public override object Run(Customers request)
    {
       return new List<Customers>() { 
           new Customers() { id = 1, Name = "murat", SurName = "xyzk" }, 
           new Customers() { id = 2, Name = "ali", SurName = "Yılmaz" } };
    }
}

С только что приведенным выше кодом автоматически становится доступным на конечных точках JSON, XML, JSV, CSV и SOAP 1.1 / 1.2, через HTTP GET или HTTP POST без какой-либо настройки.

Поскольку это инфраструктура веб-сервисов, основанная на коде, никакой кодировки не требуется, так как вы можете вызывать свои веб-сервисы, используя DTO, с которым вы определили свой веб-сервис, предоставляя этот хороший типизированный, лаконичный api:

IServiceClient client = new JsonServiceClient("http://host/baseurl");
//IServiceClient client = new XmlServiceClient("http://host/baseurl"); //to use xml instead
var customers = client.Send<List<Customers>>(new Customers());

Вы также можете легко обслуживать клиентов ajax с теми же веб-службами, которые в jQuery выглядят так:

$.getJSON("http://host/baseurl/customers", function(r) {
   console.log("customers received: #" + r.length);
});

В целом ServiceStack - это более быстрая и более чистая структура веб-служб, которая может работать в ASP.NET или автономно (самостоятельно размещаться без веб-сервера) в Windows с .NET 3.5+ или Linux с Mono.

...