2011-11-19 38 views
3

我創建了2個不同的Web服務。其中之一是經典的網絡服務和wcf網絡服務,我也將它們託管在IIS上。我通過STOPWATCH類測試了性能。 但經典的網絡服務快2或3倍!你怎麼看待這件事? 我使用googling,我看到一篇文章說「WCF提供了更好的性能,比ASP.NET Web Services快25%-50%」。 爲什麼經典的asp.net web服務比wcf更快?

經典web服務



    [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服務,並低於其Web配置:


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> 

我用秒錶在CLIEN控制檯應用程序來測試性能:

 
    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();

} 

結果:

經典的Web服務MS:00.6860078 WCF Web服務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。這讓我感到困惑。這是一種伎倆還是問題?我需要你的想法?

回答

0

如果您關注性能,請考慮使用我的ServiceStack Open Source Web Services framework。它一直在執行其他.NET庫。它具有用於.NET的最快的文本串行器,包括.NET's fastest JSON serializer

它不僅是速度遠遠超過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" } }; 
    } 
} 

只需它is automatically made available對JSON,XML,JSV,CSV和SOAP 1.1上面的代碼/1.2端點,通過HTTP GET或HTTP POST,無需任何配置。

因爲它是沒有代碼生成需要代碼優先Web服務框架或者,你可以使用DTO的你定義Web服務使用,提供了這個漂亮的類型化打電話給你的web服務,簡潔的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客戶端使用相同的Web服務,以及,這在jQuery的樣子:

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

總體ServiceStack是一個更快和更清潔的Web服務框架,它可以在ASP.NET或待機動運行獨自一人(沒有網絡服務的自我託管r)在Windows上使用.NET 3.5+或使用Mono的Linux。

5

嘗試運行一個測試,您將每個web服務調用100次。 Wcf在第一次調用時往往會有小的開銷,但一旦創建並運行後,所有後續調用都會更快。如果你拿出每個人的總數,你會看到速度增加。

5

您的測試存在缺陷。你可能只是測量預熱時間而不是實際的表現。 WCF中比ASMX還要多,所以假定預熱時間更長是合理的。

一個好的開始就是打幾個服務幾千次,並拋出前幾百個結果。