ASMX2.0¡¢WSE3.0ºÍWCFÎÊÌâ½â´ð(Ò»)

¿ª·¢ÕßÔÚÏß Builder.com.cn ¸üÐÂʱ¼ä:2008-04-01×÷ÕߣºMSDN À´Ô´:ITר¼ÒÍø

±¾ÎĹؼü´Ê£º ½â´ð WCF WSE .NET

Microsoft® .NET Framework 2.0 °æÍ¨¹ý¼¸¸öÓÐȤµ«¿ÉÄÜÁîÈËÀ§»óµÄ·½Ê½ÖØËÜÁË Web ·þÎñµÄǰ¾°¡£Òò´Ë£¬±¾ÔÂÎÒ´òËã½â´ðһЩÓë ASP.NET Web Services (ASMX) 2.0¡¢Web Services Enhancements (WSE) 3.0 ºÍ Windows® Communication Foundation (WCF)(WinFX® µÄÒ»²¿·Ö)ÓйصÄ×î³£¼ûÎÊÌâ¡££¨²é¿´µÚ¶þ²¿·Ö£©

¡¡¡¡ÎÊ:ÄܽâÊÍÒ»ÏÂÖ§³Ö½Ó¿ÚµÄРASMX 2.0 µÄ¹¤×÷·½Ê½Âð?ÄÄЩÊôÐÔÓÃÓÚ½Ó¿Ú£¬ÄÄЩÊôÐÔÓÃÓÚÀà?

¡¡¡¡´ð:.NET Framework 2.0 ÖÐµÄ ASMX ¿ò¼ÜÒýÈëÁËÒ»¸öÖØ´óµÄ±à³ÌÄ£Ð͸Ľø:Äܹ»ÔÚ .NET ½Ó¿Ú¶¨ÒåÖж¨Òå Web ·þÎñЭ¶¨¡£´Ë¹¦ÄÜÔÊÐíÄúʹÓ󣹿µÄ System.Web.Services ÊôÐÔ([WebServiceBinding]¡¢[WebMethod]¡¢[SOAPDocumentMethod] µÈ)À´Åú×¢ .NET ½Ó¿Ú¶¨Ò塣Ȼºó£¬Äú¾Í¿ÉÒÔÔÚ .NET ÀàÉÏʵÏÖ .NET ½Ó¿Ú£¬ÒÔÓÐЧµØÊµÏÖ·þÎñЭ¶¨¡£

¡¡¡¡¸Ã·½·¨Óë WCF Öеķ½·¨(Ö÷񻂿±ðÊÇÊôÐÔÃû²»Í¬)Ê®·ÖÀàËÆ¡£ËüÔÊÐíÄú´ÓʵÏÖ´úÂëÖÐÈ¥ñî·þÎñЭ¶¨£¬´Ó¶øÊ¹¹ÜÀíºÍÖØÓñäµÃ¸ü¼Ó·½±ã£¬Ò²Ê¹´úÂëµÄ¿É¶ÁÐÔ¸ü¸ß¡£ÈçÏÂÏÔʾ¸Ã·½·¨µÄÒ»¸öʾÀý¡£

using System.Web.Services;

[WebServiceBinding(
    Name = "QuoteService",
    Namespace = "http://example.org/stocks",
    ConformsTo = WsiProfiles.BasicProfile1_1,
    EmitConformanceClaims=true)]
public interface IQuoteService
{
    [WebMethod]
    StockQuote GetQuote(string symbol);
    [WebMethod]
    List<StockQuote> GetQuotes(List<string> symbols);
}

[WebService(Namespace="http://example.org/stocks")]
public class QuoteService : IQuoteService
{
    public StockQuote GetQuote(string symbol)
    {
        ... // retrieve and return new StockQuote
    }
    public List<StockQuote> GetQuotes(List<string> symbol)
    {
        ... // retrieve and return List<StockQuote>
    }
}

¡¡¡¡[WebServiceBinding] ºÍ [WebMethod] ÓÃÓÚ½Ó¿Ú£¬¶ø [WebService] ÓÃÓÚÀࡣʹÓôËÄ£ÐÍʱ£¬Ó°Ïì·þÎñЭ¶¨¶¨ÒåµÄËùÓÐÊôÐÔ¶¼±ØÐëÖÃÓÚ½Ó¿Ú¶¨Òå(¶ø²»ÊÇÀà)ÖС£Õâ°üÀ¨ [SOAPDocumentService]¡¢[SOAPDocumentMethod] ÒÔ¼°Äܹ»Ó¦ÓÃÓÚ·½·¨Ç©ÃûµÄ¸÷ÖÖ System.XML.Serialization ÊôÐÔ¡£Äú²»ÄÜ¿ç½Ó¿ÚºÍÀඨÒå»ìºÏºÍÆ¥ÅäÕâЩÊôÐÔ£¬ASMX ½«°ïÖúÄúÈ·±£ÕâÒ»µã¡£

¹²5Ò³¡£ 1 2 3 4 5 :ÀýÈ磬һµ©Äú´Ó½Ó¿ÚÅÉÉúÁËÒ»¸ö°üº¬ÕâЩ·þÎñЭ¶¨ÊôÐÔµÄÀàÖ®ºó£¬ASMX ½«ÔÚÔËÐÐʱ¼ì²é¸ÃÀàÒÔÈ·±£ÄúûÓÐʹÓÿÉÄÜ»áÔÚ½«À´¸ü¸Ä·þÎñЭ¶¨µÄÈκθ½¼ÓÊôÐÔ¡£Èç¹û ASMX ·¢ÏÖÁË´ËÀ฽¼ÓÊôÐÔ£¬Ëü½«ÏÔʾһ¸ö´íÎó£¬Ö¸³öÄúÎ¥·´ÁËÄ£ÐÍ¡£

¡¡¡¡ASMX ·þÎñÊôÐÔÓ÷¨´íÎó

¡¡¡¡ËäÈ»Õâ×îС»¯ÁËÐèÒªÔÚÅÉÉúÀàÉÏʹÓõÄÊôÐÔÊýÁ¿£¬µ«ÈÔÓÐһЩÐèÒªÓÃÓÚÅäÖ÷þÎñÖÕ½áµã¡£Äú½«ÔÚÀàÉÏʹÓà [WebService] À´Ö¸¶¨ÖÕ½áµãµÄ ÏêϸÐÅÏ¢¡£ÕâºÜÓÐÒâÒ壬ԭÒòÊÇÄú¿ÉÒÔÈöà¸ö·þÎñʵÏÖͬһ¸ö·þÎñЭ¶¨¡£Í¬Ñù£¬Èç¹ûÄúʹÓà WSE 3.0£¬ÔòÓ¦ÔÚÀàÉÏʹÓà [Policy] ½«°²È«²ßÂÔÅäÖÃÓ¦ÓÃÓÚÌØ¶¨µÄÖÕ½áµã¡£

¡¡¡¡µ«ÔÚijЩÇé¿öÏ£¬Èç¹ûÐèҪͨ¹ý¸÷ÖÖ [WebMethod] ÊôÐÔ(BufferResponse¡¢CacheDuration¡¢EnableSession¡¢TransactionOption)À´ÅäÖñ¾µØ´¦ÀíÐÐΪ£¬Äú¿ÉÄÜ»¹ÐèÒªÔÚÅÉÉú·½·¨ÉÏʹÓà [WebMethod]¡£ÀýÈ磬ÈçÏÂËùʾµÄ´úÂëÖУ¬ÎÒʹÓà [WebMethod] À´ÅäÖÃÏìÓ¦»º´æ¡£

[WebService(Namespace="http://example.org/stocks")]
public class QuoteService : IQuoteService
{
    [WebMethod(CacheDuration=60)]
    public StockQuote GetQuote(string symbol)
    {
        ... // retrieve and return new StockQuote
    }
    [WebMethod(CacheDuration=60)]
    public List<StockQuote> GetQuotes(List<string> symbol)
    {
        ... // retrieve and return List<StockQuote>
    }
}

¡¡¡¡´Ë´¦Ê¹Óà [WebMethod] ²»»áÓ°Ïì·þÎñЭ¶¨¡£ËüÖ»ÅäÖñ¾µØ´¦ÀíÐÐΪ¡£ÔÚ¸ÃÉÏÏÂÎÄÖÐʹÓà [WebMethod] ʱ£¬ÄúÖ»ÄÜʹÓÃÕâЩÐÐΪÊôÐÔ£¬²¢ÇÒ±ØÐë±ÜÃâÄܹ»Ð޸ķþÎñЭ¶¨µÄÈκÎÊôÐÔ¡£

¹²5Ò³¡£ 9 1 2 3 4 5 ÎÊ:ÈçºÎÔÚ×Ô¶¨ÒåÓ¦ÓóÌÐòÖгÐÔØ ASMX 2.0 Àà(²»Ê¹Óà IIS)?

¡¡¡¡´ð:ÔÚ MSDN®Magazine 2004 Äê 12 ÔµÄרÀ¸ (Service Station: Run ASMX Without IIS) ÖУ¬ÎÒÌÖÂÛÁËÈçºÎÀûÓà HTTP.sys ºÍ .NET Framework 2.0 ÖÐÐ嵀 HTTPListener ÀàÔÚ×Ô¼ºµÄÓ¦ÓóÌÐòÖÐËÞÖ÷ ASP.NET ¹ÜµÀ¡£ÕâÊÇÒ»¸öÖØÒªµÄÈÎÎñ£¬Ò²ÊÇÔÚ×Ô¼ºµÄÓ¦ÓóÌÐòÖÐÓÚ IIS Íâ²¿ÖØÓà ASMX ÀàµÄΨһ·½Ê½¡£µ« WSE 3.0 ÓëÖ®ÍêÈ«²»Í¬¡£

¡¡¡¡WSE 3.0 ͨ¹ýËüµÄÏûÏ¢´¦Àí²ãºÍËÞÖ÷Ä£Ðͺϲ¢ÁËеĺ͸ĽøºóµÄ ASMX 2.0 ±à³ÌÄ£ÐÍ¡£Õâ¿ÉÒÔͨ¹ýÈκÎÖ§³Ö WSE µÄ´«Êä(Èç TCP)ÔÚ×Ô¼ºµÄÓ¦ÓóÌÐòÖÐËÞÖ÷ ASMX ÖÕ½áµã¡£ÕâÒâζ×Å£¬ÏÖÔÚÎÒ¿ÉÒÔÔÚ Windows ·þÎñ¡¢Windows ´°ÌåÓ¦ÓóÌÐòÉõÖÁ¿ØÖÆÌ¨Ó¦ÓóÌÐòÖгÐÔØÈçͼ 1ËùʾµÄ ASMX ´úÂë¡£´úÂëºÜ¼òµ¥ ¡ª Ö»Ðèµ÷Óà SOAPReceivers.Add ²¢Ìṩ ASMX À༴¿É£¬ÈçÏÂËùʾ:

class Program {
    static void Main(string[] args) {
        Uri uri = new Uri("SOAP.tcp://localhost:9393/quoteservice");
        SOAPReceivers.Add(uri, typeof(QuoteService));
        Console.WriteLine("Listening...");
        Console.ReadLine();
    }
}

¡¡¡¡ÕâÓë WCF Ä£Ðͷdz£ÀàËÆ£¬Äú¿ÉÒÔʹÓà ServiceHost ÔÚÈκÎËÞÖ÷»·¾³ÖгÐÔØ·þÎñÀàÐÍ¡£µ«ÄúÏȲ»Òª¼¤¶¯£¬ÎÒÓ¦¸ÃÖ¸³ö£¬Äú²»ÄÜÏñ¶Ô´ý WCF ÖÐµÄ ServiceHost ÄÇÑù½« HTTP µØÖ·Ìṩ¸ø SOAPReceivers.Add¡£SOAPReceivers ²»ÌṩÓë HTTP.sys µÄÖ±½Ó¼¯³É£¬¶øÕâÕýÊDZ¾ÀýËùÐèµÄ¡£Òò´Ë£¬ÒªÍ¨¹ý HTTP ³ÐÔØ ASMX ·þÎñ£¬Äú±ØÐëת»»Îª Ó³Éä»òÕß×Ô¼º±àд HTTP.sys ¼¯³É´úÂë¡£

¹²5Ò³¡£ 9 1 2 3 4 5 ¡¡ÎÊ:WCF Ϊ¿ª·¢ÈËÔ±ÌṩÁËÄÄЩ ASMX 2.0 ºÍ WSE 3.0 ËùûÓеŦÄÜ?

¡¡¡¡´ð:ASMX 2.0 ºÍ WSE 3.0 ÌṩÁËÐí¶àÖØÒª¹¦ÄÜ£¬µ«Ä³Ð©¿ª·¢ÈËÔ±´íÎóµØÈÏΪÕâЩ¹¦ÄÜÖ»ÊôÓÚ WCF¡£ÀýÈ磬ËüÃǵĶÑÕ»¶¼ÌṩÁËÀàËÆµÄ»ùÓÚÊôÐԵıà³ÌÄ£ÐÍ£¬ÆäÖУ¬Äú¿ÉÒÔ¸ù¾Ý .NET ½Ó¿Ú¶¨Òå±àд·þÎñЭ¶¨(²Î¼û±¾×¨À¸µÄµÚÒ»¸öÎÊÌâºÍ½â´ð)¡£ËüÃǵĶÑÕ»¶¼ÌṩÓë´«Ê䷽ʽÎÞ¹ØµÄ SOAP ʵÏÖ£¬¿ÉÒÔËæ¸½¶à¸ö´«ÊäÐŵÀºÍ×Ô¶¨Òå´«Êä¹Ò¹³¡£ËüÃǵĶÑÕ»¶¼ÔÊÐíÔÚÈκλùÓÚ Windows µÄÓ¦ÓóÌÐòÖгÐÔØ·þÎñ(ͨ¹ý WSE ÖÐµÄ SOAPReceivers »ò WCF ÖÐµÄ ServiceHost)¡£ËüÃǵĶÑÕ»¶¼Ìṩ¶à¸öÏûÏ¢±àÂ뷽ʽ£¬°üÀ¨Á½¸ö×î¹ã·ºÊÜÖ§³ÖµÄ±àÂ뷽ʽ:XML 1.0 ºÍÏûÏ¢´«ÊäÓÅ»¯»úÖÆ (MTOM)¡£ËüÃǵĶÑÕ»¶¼Ö§³Ö»ùÓÚÏûÏ¢µÄ°²È«ÐÔ£¬²¢ÇÒ¿Éͨ¹ý¼òµ¥µÄÅäÖÃÔªËØ½øÐÐÅäÖÃ(Äܹ»Á¢¼´ÆôÓõݲȫÐÔÅäÖÃÎļþ)¡£Í¼ 4 Öеıí¸ñ×ܽáÁ˶ÑÕ»µÄ±È½Ï·½Ê½¡£

Feature ASMX 2 .0 plus WSE 3. 0 WCF
Hosting IIS/ASP.NET (.asmx)
SoapReceivers
IIS/ASP.NET (.svc)
ServiceHost<T>
WAS
Programming Model [WebService], [WebMethod], and so on (supports interfaces, generics, and the like) [ServiceContract], [OperationContract], and so on (supports interfaces, generics, and so on)
Message Exchange Patterns (MEP) One-way
Request-response
Custom (using WSE API)
One-way
Request-response
First/last-operation
Duplex
Custom
XML Serialization System.Xml
.Serialization
System.Runtime
.Serialization
System.Xml.Serialization
(you can choose)
Encodings XML 1.0
MTOM
DIME
Custom
XML 1.0
MTOM
Binary
Custom
Transports HTTP
TCP
Custom
HTTP
TCP
Named pipes
MSMQ
P2P
Custom
Protocols Security Security
Reliable messaging
Transactions
Behaviors (enabled via attributes or configuration Local DTC transactions
HTTP buffering
HTTP caching
HTTP sessions
Custom (via SoapExtensions, WSE filters)
Concurrency
Instancing
Throttling
Thread-binding
Exception handling and faults
Impersonation
Session management
Transaction behaviors
Custom (via behavior types)

¡¡¡¡¶ÑÕ»µÄÖ÷Òª²»Í¬Ö®´¦ÔÚÓÚËüÃǶԸ÷ÖÖ WS-* ¹æ·¶µÄÖ§³Ö¡£WSE 3.0 ½öÖ§³Ö°²È«¿ò¼Ü£¬¶ø WCF Ö§³Ö°²È«¿ò¼Ü¡¢¿É¿¿ÏûÏ¢´¦Àí¿ò¼ÜºÍÊÂÎñ¿ò¼Ü¡£Èç±í¸ñËùʾ£¬WCF »¹Ìṩ¸ü¶àµÄ±¾µØ´¦ÀíÐÐΪºÍ×Ô¶¨Òå¹Ò¹³¡£Êµ¼ÊÉÏ£¬WCF ¶ÔÏóÄ£ÐÍÖеÄÿһ²ã¶¼¿ÉÒÔͨ¹ý´úÂë¡¢ÊôÐÔ»òÅäÖýøÐÐÀ©Õ¹¡£

¡¡¡¡×îÖÕ£¬WCF Ìṩ¸üÍêÕûµÄ¿ª·¢¿ò¼Ü£¬¸Ã¿ò¼ÜÊÇÎ§ÈÆ¸÷ÖÖ Web ·þÎñЭÒé´ÓÍ·¿ªÊ¼Éè¼ÆµÄ¡£ÏÖÔÚ£¬Èç¹ûʹÓà ASMX 2.0 ºÍ WSE 3.0£¬ÄúÈÔÈ»¿ÉÒÔ»ñµÃ·Ç³£ÀàËÆµÄÌåÑé¡£´ËÍ⣬δÀ´Ç¨ÒƵÄǰ¾°Ò²ºÜ¿´ºÃ¡£

¹²5Ò³¡£ 9 1 2 3 4 5 ¡¡ÎÊ:½« ASMX ´úÂëÒÆÖ²µ½ Windows Communication Foundation À§ÄÑÂð?

¡¡¡¡´ð:µ±È»²»À§ÄÑ£¬³ý·ÇÄúÈÏΪ¸ü¸ÄÊôÐÔÃûºÜÀ§ÄÑ¡£½« ASMX ´úÂëÒÆµ½ WCF ÊÇÒ»¸ö»úе¹ý³Ì£¬Èç¹ûÐèÒª£¬ÄúÉõÖÁ¿ÉÒÔÔÚÒ»¶¨³Ì¶ÈÉÏ×Ô¶¯»¯¡£¸Ã¹ý³ÌÐèÒª½«¸÷ÖÖ System.Web.Services ºÍ System.Web.Services.Protocols ÊôÐÔת»»ÎªµÈЧµÄ System.ServiceModel ÊôÐÔ¡£ÈçÏÂÏÔʾһ¸öʾÀý£¬ËµÃ÷ÈçºÎ½«µÚÒ»¶Î´úÂëÖÐµÄ ASMX ´úÂëÒÆÖ²µ½ WCF¡£

using System.ServiceModel;

[ServiceContract(
    Name = "QuoteService",
    Namespace = "http://example.org/stocks",
    FormatMode = ContractFormatMode.XmlSerializer)]
public interface IQuoteService
{
    [OperationContract]
    StockQuote GetQuote(string symbol);
    [OperationContract]
    List<StockQuote> GetQuotes(List<string> symbols);
}

public class QuoteService : IQuoteService
{
    public StockQuote GetQuote(string symbol)
    {
        ... // retrieve and return new StockQuote
    }
}

¡¡¡¡ÕâÁ½¸ö¿ò¼Ü¶¼Ö§³Ö¶ÔÀඨÒå»òµ¥¶ÀµÄ½Ó¿Ú¶¨Òå½øÐÐÅú×¢£¬Òò´Ë¶îÍâµÄÖØ¹¹²¢²»ÊDZØÐèµÄ£¬µ«¿ÉÄÜÓÐÕâ·½ÃæµÄÐèÒª¡£´ËÍ⣬ͨ¹ýʹÓà FormatMode=ContractFormatMode.XMLSerializer£¬Èç¹û²»ÐèÒª£¬ÄúÔò²»±Ø½«ËùÓÐÏûÏ¢ÀàÐÍÒÆÖ²µ½Ð嵀 [DataContract] Ä£ÐÍ¡£Ëæ×Å WCF ·¢²¼ÈÕÆÚµÄÁÙ½ü£¬Microsoft ½«¹«²¼¸ü¶àÏêϸµÄÇ¨ÒÆÏ¸½Ú¡£

 

¹²5Ò³¡£ 9 1 2 3 4 5

Óû§ÆÀÂÛ

  • Óû§Ãû
  • ÆÀÂÛÄÚÈÝ