¡¡¡¡ÎÊ:ÄܽâÊÍÒ»ÏÂÖ§³Ö½Ó¿ÚµÄР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( [WebService(Namespace="http://example.org/stocks")] |
¡¡¡¡[WebServiceBinding] ºÍ [WebMethod] ÓÃÓÚ½Ó¿Ú£¬¶ø [WebService] ÓÃÓÚÀࡣʹÓôËÄ£ÐÍʱ£¬Ó°Ïì·þÎñж¨¶¨ÒåµÄËùÓÐÊôÐÔ¶¼±ØÐëÖÃÓÚ½Ó¿Ú¶¨Òå(¶ø²»ÊÇÀà)ÖС£Õâ°üÀ¨ [SOAPDocumentService]¡¢[SOAPDocumentMethod] ÒÔ¼°Äܹ»Ó¦ÓÃÓÚ·½·¨Ç©ÃûµÄ¸÷ÖÖ System.XML.Serialization ÊôÐÔ¡£Äú²»ÄÜ¿ç½Ó¿ÚºÍÀඨÒå»ìºÏºÍÆ¥ÅäÕâЩÊôÐÔ£¬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] ʱ£¬ÄúÖ»ÄÜʹÓÃÕâЩÐÐΪÊôÐÔ£¬²¢ÇÒ±ØÐë±ÜÃâÄܹ»Ð޸ķþÎñж¨µÄÈκÎÊôÐÔ¡£
¡¡¡¡´ð:ÔÚ 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 ¼¯³É´úÂë¡£
¡¡¡¡´ð: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£¬ÄúÈÔÈ»¿ÉÒÔ»ñµÃ·Ç³£ÀàËÆµÄÌåÑé¡£´ËÍ⣬δÀ´Ç¨ÒƵÄǰ¾°Ò²ºÜ¿´ºÃ¡£
¡¡¡¡´ð:µ±È»²»À§ÄÑ£¬³ý·ÇÄúÈÏΪ¸ü¸ÄÊôÐÔÃûºÜÀ§ÄÑ¡£½« ASMX ´úÂëÒÆµ½ WCF ÊÇÒ»¸ö»úе¹ý³Ì£¬Èç¹ûÐèÒª£¬ÄúÉõÖÁ¿ÉÒÔÔÚÒ»¶¨³Ì¶ÈÉÏ×Ô¶¯»¯¡£¸Ã¹ý³ÌÐèÒª½«¸÷ÖÖ System.Web.Services ºÍ System.Web.Services.Protocols ÊôÐÔת»»ÎªµÈЧµÄ System.ServiceModel ÊôÐÔ¡£ÈçÏÂÏÔʾһ¸öʾÀý£¬ËµÃ÷ÈçºÎ½«µÚÒ»¶Î´úÂëÖÐµÄ ASMX ´úÂëÒÆÖ²µ½ WCF¡£
|
using System.ServiceModel; [ServiceContract( public class QuoteService : IQuoteService |
¡¡¡¡ÕâÁ½¸ö¿ò¼Ü¶¼Ö§³Ö¶ÔÀඨÒå»òµ¥¶ÀµÄ½Ó¿Ú¶¨Òå½øÐÐÅú×¢£¬Òò´Ë¶îÍâµÄÖØ¹¹²¢²»ÊDZØÐèµÄ£¬µ«¿ÉÄÜÓÐÕâ·½ÃæµÄÐèÒª¡£´ËÍ⣬ͨ¹ýʹÓà FormatMode=ContractFormatMode.XMLSerializer£¬Èç¹û²»ÐèÒª£¬ÄúÔò²»±Ø½«ËùÓÐÏûÏ¢ÀàÐÍÒÆÖ²µ½Ð嵀 [DataContract] Ä£ÐÍ¡£Ëæ×Å WCF ·¢²¼ÈÕÆÚµÄÁÙ½ü£¬Microsoft ½«¹«²¼¸ü¶àÏêϸµÄÇ¨ÒÆÏ¸½Ú¡£
Óû§ÆÀÂÛ