Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
WCF4.0 ¨C- RESTful WCF Services£¨Ò»£©
 
×÷Õߣº»úÆ÷ÈË À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-6-23
  3568  次浏览      28
 

WCF4.0 ¨C- RESTful WCF Services (1) (ÈëÃÅ)

WCF ºÜºÃµÄÖ§³ÖÁË REST µÄ¿ª·¢£¬ ¶ø RESTful µÄ·þÎñͨ³£ÊǼܹ¹²ãÃæÉϵĿ¼ÂÇ¡£ ÒòΪËüÌìÉú¾Í¾ßÓÐºÜºÃµÄ¿çÆ½Ì¨¿çÓïÑԵÉÄÜÁ¦£¬¼¸ºõËùÓеÄÓïÑÔºÍÍøÂçÆ½Ì¨¶¼Ö§³Ö HTTP ÇëÇó£¬ÎÞÐèȥʵÏÖ¸´ÔӵĿͻ§¶Ë´úÀí£¬ÎÞÐèʹÓø´ÔÓµÄÊý¾ÝͨѶ·½Ê½¼È¿ÉÒÔ½«ÎÒÃǵķþÎñ±©Â¶¸øÈκÎÐèÒªµÄÈË£¬ÎÞÂÛËûʹÓà VB¡¢Ruby¡¢JavaScript£¬ÉõÖÁÊÇ HTML FORM£¬»òÕßÖ±½ÓÔÚä¯ÀÀÆ÷µØÖ·À¸ÊäÈë¡£

WCF ÖÐͨ¹ý WebGetAttribute¡¢WebInvokeAttribute (GET/PUT/POST/DELETE)¡¢UriTemplate ¶¨Òå REST µÄ·þÎñµÄµ÷Ó÷½Ê½£¬ ͨ¹ý WebMessageFormat (Xml/Json) ¶¨ÒåÏûÏ¢´«µÝµÄ¸ñʽ¡£

1. ÆõÔ¼

using System;  
2.using System.Collections.Generic;  
3.using System.Runtime.Serialization;  
4.using System.ServiceModel;  
5.using System.ServiceModel.Web;  
6.  
7.namespace WcfRESTfulSvc1  
8.{  
9.    [ServiceContract]  
10.    public interface ITaskService  
11.    {  
12.        [OperationContract]  
13.        [WebGet(UriTemplate="Tasks/Xml", ResponseFormat=WebMessageFormat.Xml)]  
14.        List GetTasksXml();  
15.  
16.        [OperationContract]  
17.        [WebGet(UriTemplate = "Tasks/Json", ResponseFormat = WebMessageFormat.Json)]  
18.        List GetTasksJson();  
19.  
20.        [OperationContract]  
21.        [WebInvoke(UriTemplate="Task/{title}", Method="GET", ResponseFormat=WebMessageFormat.Json)]  
22.        Task GetTasksByTitle(string title);  
23.    }  
24.  
25.  
26.    [DataContract]  
27.    public class Task  
28.    {  
29.        [DataMember]  
30.        public string Title { get; set; }  
31.        [DataMember]  
32.        public string Detail { get; set; }  
33.        [DataMember]  
34.        public DateTime CreatedDate { get; set; }  
35.    }  
36.}  

2. ʵÏÖ

using System;  
2.using System.Collections.Generic;  
3.using System.Linq;  
4.  
5.namespace WcfRESTfulSvc1  
6.{  
7.    public class TaskService : ITaskService  
8.    {  
9.        public List GetTasksXml()  
10.        {  
11.            return GetData();  
12.        }  
13.  
14.        public List GetTasksJson()  
15.        {  
16.            return GetData();  
17.        }  
18.  
19.        public Task GetTasksByTitle(string title)  
20.        {  
21.            return GetData().Where(t => t.Title == title).FirstOrDefault();  
22.        }  
23.  
24.        private static List GetData()  
25.        {  
26.            return new List  
27.            {  
28.                new Task { Title="Task1", Detail="Do Something 1", CreatedDate=DateTime.Now },  
29.                new Task { Title="Task2", Detail="Do Something 2", CreatedDate=DateTime.Now },  
30.                new Task { Title="Task3", Detail="Do Something 3", CreatedDate=DateTime.Now },  
31.                new Task { Title="Task4", Detail="Do Something 4", CreatedDate=DateTime.Now },  
32.                new Task { Title="Task5", Detail="Do Something 5", CreatedDate=DateTime.Now },  
33.            };  
34.        }  
35.    }  
36.}  

ͨ¹ý WCF 4.0 Àï´´½¨µÄ WCF Service Application ·¢²¼REST·þÎñºÜ¼òµ¥£¬Ö»ÐèÒªÔÚ svc µÄ Markup Àï¼ÓÉÏ Factory£º

<%@ ServiceHost Language="C#" Debug="true" 
                          Service="WcfRESTfulSvc1.TaskService" CodeBehind="TaskService.svc.cs" 
                          Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>

BTW: ²»¹ýÕâÑù£¬WCFµÄMetadata¾Í²»ÄÜ·ÃÎʵ½ÁË£¬Ò²¾Í˵²»ÄÜ·ÃÎʵ½svcµÄwsdlÁË¡£

OK£¬ÔÚä¯ÀÀÆ÷ÖмüÈë http://localhost:2571/TaskService.svc/Tasks/Xml ¾ÍÄܵõ½½á¹û£º

<ArrayOfTask xmlns="http://schemas.datacontract.org/2004/07/WcfRESTfulSvc1"
 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">  
2. <Task>
3. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
4. <Detail>Do Something 1</Detail>
5. <Title>Task1</Title>
6. </Task>
7. <Task>
8. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
9. <Detail>Do Something 2</Detail>
10. <Title>Task2</Title>
11. </Task>
12. <Task>
13. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
14. <Detail>Do Something 3</Detail>
15. <Title>Task3</Title>
16. </Task>
17. <Task>
18. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
19. <Detail>Do Something 4</Detail>
20. <Title>Task4</Title>
21. </Task>
22. <Task>
23. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
24. <Detail>Do Something 5</Detail>
25. <Title>Task5</Title>
26. </Task>
27.</ArrayOfTask>

¿Í»§¶ËµÄµ÷ÓÃÀûÓÃSystem.Net.WebClientÒ²ºÜÈÝÒ×£º

var client = new WebClient();  
2.this.txtResponse.Text = client.DownloadString(url);

JsonµÄ·µ»Ø½á¹û£º

[{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 1","Title":"Task1"},
{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 2","Title":"Task2"},
{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 3","Title":"Task3"},
{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 4","Title":"Task4"},
{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 5","Title":"Task5"}]

ÔÙÀ´¿´¿´ÀûÓÃjQueryÈçºÎµ÷ÓÃÕâ¸ö·þÎñ£º

<mce:script type="text/javascript" language="JavaScript"><!--  
2. $(document).ready(function () {
3. $("#btnGet").click(function () {
4. var url = $("#txtUrl").val();
5. $.get(url, function (data) {
6. for (var i = 0; i < data.length; i++)
7. $("#divResponse").append("<li>" +
8. data[i].Title + "&nbsp;-&nbsp;" +
9. data[i].Detail + "</li>");
10. });
11. });
12. });
13.// --></mce:script>

WCF4.0 ¨C- RESTful WCF Services (2) (ʵÏÖÔö£¬É¾£¬¸Ä£¬²é)

RESTful·þÎñ¾ÍÊÇΪÁËʵÏÖÒ»¸öÒ×ÓÚÕûºÏµÄϵͳ£¬¿ÉÒÔ¿çÆ½Ì¨¿çÓïÑԵĵ÷ÓÃ(ÈçÏÂͼ)£¬¡¾ÉÏÆª¡¿½éÉÜÁËÈçºÎÓÃWCF¹¹½¨Ò»¸öRESTfulµÄ·þÎñ¡£

±¾Æª½øÒ»²½Í¨¹ýÒ»¸öʵÀý¼Ç¼ÈçºÎʵʩһ¸ö¾ßÌåµÄRESTful WCF·þÎñÒÔ¼°¿Í»§¶Ëµ÷Ó÷þÎñ½øÐÐÔö£¬É¾£¬¸Ä£¬²é¡£

WCF 4.0 Æäй¦ÄÜÖ®Ò»¾ÍÊÇ WCF ¸üÈÝÒ×ÒÔ REST API À´³ÊÏÖ£¬ÔÚ WCF 3.5 ÖÐµÄ WebGetAttribute Óë WebInvokeAttribute ÖÐµÄ UriTemplate ²ÎÊýÔ­±¾²»Ö§³Ö REST URL ¸ñʽ£¬ÎªÁË REST ¹¦ÄÜ£¬Î¢Èí»¹ÌØÒâ·¢²¼ÁË WCF REST Starter Kit ×é¼þ£¬Èÿª·¢ÈËÔ±¿ÉÒÔÀûÓà WCF 3.5 ¿ª·¢ÕæÕý REST-based µÄÓ¦ÓóÌÐò£¬ÓÉ URL ¶ÔÓ¦µ½Ö¸¶¨µÄ Service Contract ÖÐµÄ Operation Contract£¬ÔÚ WCF 4.0 ÖУ¬WCF µÄºËÐÄÒѾ­ÈÚÈëÁË REST Starter Kit ÖÐµÄ URL ÒýÇæ£¬ÔÚ WebGetAttribute Óë WebInvokeAttribute ÒѾ­¿ÉÒÔÖ§³Ö REST µÄ¹¦ÄÜ£¬Windows Azure Ðí¶à·þÎñµÄ REST API ¾ÍÊÇÀûÓà WCF À´¿ª·¢µÄ¡£

Ö÷񻃾¼°ÒÔÏÂÄÚÈÝ£º

1. ÈçºÎͨ¹ý JSON Êý¾Ý½øÐн»»¥£»

2. ÈçºÎ½øÐзþÎñ¶ËµÄ´íÎó´¦Àí£¬²¢ÔÚ¿Í»§¶ËÇø·Ö²»Í¬µÄÒì³££»

3. ÈçºÎÀûÓà Microsoft.HttpClient (΢ÈíÌṩµÄµÚ3·½×é¼þ)£»

±¾´ÎʾÀýµÄ¹¤³Ì£º

PS£º ÉÏÃæËäÈ»ÔÚÒ»¸ösolutionÀïÓÐÁ½¸ö¹¤³Ì£¬µ«Êǹ¤³Ì֮ǰûÓÐÈκÎÒýÓá£ÍêÈ«¿¿HttpÏûÏ¢´«µÝ¡£

1. ´´½¨·þÎñ¶Ë¹¤³Ì£º

ͨ¹ýVS2010µÄExtension Manager£¬¿ÉÒÔÏÂÔØÒ»¸ö¡°WCF REST Service Template¡±¡£Í¨¹ýÕâ¸öÎÒÃÇ¿ÉÒÔ¿ìËÙ´´½¨Ò»¸öWCF REST·þÎñ¡£ËüÊÇÒ»¸ö´´½¨ÔÚWeb Application¹¤³ÌÀïµÄ·þÎñ¡£ºÍǰһƪ½éÉܵÄWCF·þÎñ²»Í¬µÄÊÇÔÚGlobel.asaxÖеÄApplication_StartʼþÖÐ×¢²á·þÎñ¡£²¢ÇÒ×¢²áµÄ"TaskService"×Ô¶¯³ÉΪ·þÎñµÄ»ùµØÖ·£¬¼´ http://<machine_name>:<port>/TaskService/

public class Global : HttpApplication  
2.{
3. void Application_Start(object sender, EventArgs e)
4. {
5. RegisterRoutes();
6. }
7.
8. private void RegisterRoutes()
9. {
10. RouteTable.Routes.Add(new ServiceRoute("TaskService",
11. new WebServiceHostFactory(), typeof(TaskService)));
12. }
13.}

2. ·þÎñµÄʵÏÖ£º

·þÎñ¶ËÖ±½Óͨ¹ýLinq2Entities²Ù×÷DB£¬ÎªÁË·µ»ØJSONµÄÊý¾Ý£¬²ÎÊýºÍ·µ»ØÖµ¶¼Éè¼ÆÎªPOCOÀà¡£ÔÚLinq2EntitiesÉú³É´úÂëºó£¬ÓÖ¿½±´ÁËÒ»·Ý½øÐÐɾ¼õÐÞ¸ÄΪPOCOÀà¡£(ÏÖÔÚÓÐÒ»¸öADO.NET POCO Generator µÄt4Ä£°å£¬²»ÖªµÀÄÜ·ñ¼ò»¯ÎÒÏÖÔÚµÄ×ö·¨...)

namespace WcfRestService2.Model  
2.{
3. [DataContract]
4. public class PocoTask
5. {
6. [DataMember]
7. public virtual int ID { get; set; }
8. [DataMember]
9. public virtual string Title { get; set; }
10. [DataMember]
11. public virtual string Detail { get; set; }
12. [DataMember]
13. public virtual int State { get; set; }
14. [DataMember]
15. public virtual DateTime UpdatedDate { get; set; }
16. }
17.}

RESTÖкܺõÄÀûÓÃÁËHTTPµÄGET/POST/PUT/DELETE·½Ê½£¬°ó¶¨µ½·þÎñµÄ²»Í¬·½·¨ÉÏ¡£±ÈÈçGET·½·¨²»Óÿͻ§¶ËÌṩ̫¶àÊý¾Ý£¬ÕýÊʺϲéѯֻÌṩÖ÷¼ü»òÕß²éѯ×ֶεij¡¾°¡£POSTÔòÊʺÏÊý¾ÝµÄ²åÈ룬PUTÔòÓ¦ÓÃÔÚÊý¾Ý¸üУ¬DELETEÔòÖ±½ÓÓÃÔÚÊý¾Ýɾ³ýÉÏ¡£µ±È»Í¨¹ýURIµÄÇø±ð£¬Ò²¿ÉÒÔÈ«²¿ÓÃPOST»òÕßPUT£¬Ö»ÊÇÓïÒå·ûºÏµ÷Óó¡¾°µÄ»°£¬ÊǵķþÎñʹÓøüÒ×ÓÚÀí½âºÍϰ¹ß¡£

·þÎñ¶ËʵÏÖÆ¬¶Î£º

(1) ²éѯ(Http/GET)£¬ÕâÀﶨÒåÁË·ÃÎʵÄUriTemplate£¬ÍêÕû·ÃÎʵØÖ·¾ÍÊÇ"»ùµØÖ·+UriTemplate"£¬±ÈÈ磺
http://localhost:port/TaskService/Tasks/State/{state} ÁíÍâResponseFormatÉ趨ΪJson¸ñʽ¡£

Ò²¿ÉÒÔÔÚÅäÖÃÎļþÖУ¬ÐÞ¸Ä <standardEndpoint> ½ÚµãµÄ defaultOutgoingResponseFormat ÊôÐÔ¿ØÖÆResponseµÄ¸ñʽ¡£

[WebGet(UriTemplate = "Tasks/State/{state}",   
2. ResponseFormat = WebMessageFormat.Json)]
3.public List<PocoTask> GetTasksByState(string state)
4.{
5. using (var db = new TasksEntities())
6. {
7. int s = Int32.Parse(state);
8. var query = db.Task.Where(t => t.State == s || -1 == s);
9. return GetPocoData(query);
10. }
11.}

(2) н¨(Http/POST)£¬POSTÀïµÄÊý¾Ý¸ñʽͨ¹ýRequestFormat¶¨ÒåΪJson£¬WCF¿ò¼Ü½ÓÊܵ½JsonÊý¾ÝµÄÇëÇ󣬻á×Ô¶¯·´ÐòÁл¯³ÉPocoTaskʵÀý¡£È»ºóÎÒÓÖ´´½¨ÕæÕýEFÀïµÄEntityʵÀý£¬½«PocoTaskÊý¾Ý¸´ÖƵ½EntityÀ²åÈëDB¡£

[WebInvoke(UriTemplate = "Tasks/Add", Method = "POST",   
2. RequestFormat=WebMessageFormat.Json)]
3.public void Create(PocoTask pocoTask)
4.{
5. var ctx = WebOperationContext.Current;
6. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
7. try
8. {
9. using (var db = new TasksEntities())
10. {
11. var task = new Task();
12. CopyValue(pocoTask, task);
13. task.UpdatedDate = DateTime.Now;
14. db.AddToTask(task);
15. db.SaveChanges();
16. }
17. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created;
18. }
19. catch (Exception ex)
20. {
21. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
22. ctx.OutgoingResponse.StatusDescription = ex.Message;
23. }
24.}

(3) ¸üÐÂ(Http/PUT)£¬ÏÈͨ¹ýid²é³öEntity£¬ÔÙ½«¿Í»§¶ËµÄÊý¾Ý¸üе½EntityÉÏ¡£

[WebInvoke(UriTemplate = "Tasks/{id}", Method = "PUT",   
2. RequestFormat=WebMessageFormat.Json)]
3.public void Update(string id, PocoTask pocoTask)
4.{
5. var ctx = WebOperationContext.Current;
6. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
7. try
8. {
9. using (var db = new TasksEntities())
10. {
11. var nId = Convert.ToInt32(id);
12. var target = db.Task.SingleOrDefault(t => t.ID == nId);
13. target.Title = pocoTask.Title;
14. target.Detail = pocoTask.Title;
15. target.State = pocoTask.State;
16. target.UpdatedDate = DateTime.Now;
17. db.SaveChanges();
18. }
19. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Accepted;
20. }
21. catch (Exception ex)
22. {
23. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
24. ctx.OutgoingResponse.StatusDescription = ex.Message;
25. }
26.}

(4) ɾ³ý(Http/DELETE)

[WebInvoke(UriTemplate = "Tasks/{id}", Method = "DELETE")]  
2.public void Delete(string id)
3.{
4. var ctx = WebOperationContext.Current;
5. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
6. try
7. {
8. using (var db = new TasksEntities())
9. {
10. var nId = Convert.ToInt32(id);
11. var task = db.Task.SingleOrDefault(t => t.ID == nId);
12. db.Task.DeleteObject(task);
13. db.SaveChanges();
14. }
15. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Accepted;
16. }
17. catch (Exception ex)
18. {
19. ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
20. ctx.OutgoingResponse.StatusDescription = ex.Message;
21. }
22.}

·þÎñ¶ËµÄÒì³£´¦ÀíÖÐͨ¹ý OutgoingResponse.StatusCode ·µ»Ø²»Í¬µÄCode£¬ÕâÑù¿Í»§¶Ëͨ¹ýÕâЩCode¾ÍÖªµÀ·þÎñ¶Ë³öÏÖÁËʲô´íÎó¡£µ«ÊÇĿǰÎÒ»¹²»ÖªµÀOutgoingResponse.StatusDescriptionÈçºÎÔÚ¿Í»§¶Ë»ñµÃ¡£Èç¹û¿ÉÒԵϰ£¬ÎÒÃǾͿÉÒÔÖªµÀ´íÎóµÄÏêϸÄÚÈÝ¡£

±¾Ê¾ÀýÖУº

a) ²éѯ³É¹¦ ¡ª¡ª System.Net.HttpStatusCode.OK (ĬÈÏ)

b) ´´½¨³É¹¦ ¡ª¡ª System.Net.HttpStatusCode.Created

c) ¸üгɹ¦ ¡ª¡ª System.Net.HttpStatusCode.Accepted

d) ɾ³ý³É¹¦ ¡ª¡ª System.Net.HttpStatusCode.Accepted

System.Net.HttpStatusCodeµÄö¾Ù¿ÉÒԲο´ MSDN£º http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx¡£

3. ¿Í»§¶ËʵÏÖ£º

ÒòΪREST ÊÇ»ùÓÚHTTPµÄ£¬ ËùÒÔ¶ÔÓÚ REST µÄ¿Í»§¶ËµÄ¿ª·¢Õߣ¬ÎÞ·¨Ïñ´«Í³µÄ WebService»òÕ߯äËûµÄWCF·þÎñͨ¹ýÒýÓÃwsdl£¬ÏíÊÜ¡°Éݳޡ±µÄ´úÂëÉú³É£¬¶øÊ¹ÓÃÇ¿ÀàÐ͵ı¾µØ´úÀíµ÷Ó÷þÎñ¡£ ¿ª·¢ÕßÖ»ÄÜͨ¹ý Http Request µÄ×é×°£¬ µ«ÕýÒòΪÕâÖÖÖ±½ÓµÄHttpRequest×é×°£¬¶øÊ¹µÃ¿Í»§¶ËÕæÕýÊÇÓïÑÔÎ޹صġ£ÕâÀï²»µÃ²»ÌáһϠMicrosoft.Http.dll ºÍ Microsoft.Http.Extensions.dll£¬ËüÃÇÊÇ΢ÈíÌṩµÄREST¿Í»§¶Ë°ü¡£¿ÉÒÔ¸ü¼Ó·½±ãµØ²Ù×÷ HttpRequest/Response£¬Äã¿ÉÒÔÔÚÕâÀïϵ½£º http://aspnet.codeplex.com/releases/view/24644

¿Í»§¶ËƬ¶Î£º

(1) ²éѯ(HTTP/GET), ʹÓà HttpClient.Get ·½·¨£¬·µ»ØµÄÊÇHttpResponseMessage£¬HttpResponseMessage.Content ·µ»ØµÄÊÇJsonÊý¾Ý¡£ÔÙͨ¹ý Json.NET µÚ3·½×é¼þ½øÐз´ÐòÁл¯¡£ÁíÍ⣬ΪÁËÊÇÔÚ¿Í»§¶ËÀïÄÜͨ¹ýʵÀý»¯µÄÀàÀ´²Ù×÷Êý¾Ý£¬ËùÒÔÔÚ¿Í»§¶Ëµ¥¶ÀÔÙ¶¨ÒåÁË Task Àà¡£(ÒòΪ¿Í»§¶ËÎÞ·¨Í¨¹ýwsdlÉú³É´úÀí)

// Get Data by state    
2.var client = new HttpClient();
3.var strUrl = "http://localhost:1180/TaskService/Tasks/State/{0}";
4.strUrl = string.Format(strUrl, comboBox1.SelectedValue);
5.var response = client.Get(strUrl);
6.response.EnsureStatusIsSuccessful();
7.var json = response.Content.ReadAsString();
8.var data = JsonConvert.DeserializeObject<List<Task>>(json);

(2) н¨(HTTP/POST)£¬½«Êý¾ÝÐòÁл¯³ÉJson¸ñʽ·Å½ø HttpContent ÔÙʹÓà HttpClient.Post Ìá½» HttpContent Êý¾Ý¡£
HttpContent ÐèÒªÖ¸¶¨ ContentType ÊÇJson¸ñʽµÄ

// Add Task   
2.var task = GetTask();
3.var client = new HttpClient();
4.var strUrl = "http://localhost:1180/TaskService/Tasks/Add";
5.var response = client.Post(strUrl, GetContent(task));
6.response.EnsureStatusIsSuccessful();

(3) ¸üÐÂ(HTTP/PUT)

// Update Task   
2.var task = GetTask();
3.var client = new HttpClient();
4.var strUrl = "http://localhost:1180/TaskService/Tasks/{0}";
5.strUrl = string.Format(strUrl, task.ID);
6.var response = client.Put(strUrl, GetContent(task));
7.response.EnsureStatusIsSuccessful();

(4) ɾ³ý(HTTP/DELETE)

// Delete Task   
2.var task = GetTask();
3.var client = new HttpClient();
4.var strUrl = "http://localhost:1180/TaskService/Tasks/{0}";
5.strUrl = string.Format(strUrl, task.ID);
6.var response = client.Delete(strUrl);
7.response.EnsureStatusIsSuccessful();

Ŷ£¬»¹Â©Á˸ö GetContent(Task task) ·½·¨£º

private HttpContent GetContent(Task task)  
2.{
3. var strContent = JsonConvert.SerializeObject(task);
4. var data = System.Text.Encoding.UTF8.GetBytes(strContent);
5. return HttpContent.Create(data, "application/json");
6.}

response.EnsureStatusIsSuccessful ÓÃÀ´¼ì²é Response.StatusCode¡£

WCF4.0 ¨C- RESTful WCF Services (3) (Raw Stream)

Ç°Ãæ2ƪblog£¬Ö÷ÒªÔÚ½éÉÜREST WCFÈçºÎͨ¹ýjson/xml ºÍ¿Í»§¶ËÍê³É½»»¥¡£ ÕâÆªÎÄÕ½«¶ÔREST WCFµÄÔ­Éú(RAW)Á÷´«Êä½øÐÐÒ»´ÎʵÀý·ÖÎö¡£

OK£¬»¹ÊÇÀûÓà WCF REST Service Application µÄ¹¤³ÌÄ£°å£¬´´½¨ÎÒÃǵÄREST WCF¹¤³Ì¡£

ÒòΪWCF REST·þÎñ²»ÐèÒª¹«¿ªmetadata, ËùÒÔ OperationContract µÄ¶¨ÒåҲʡÂÔÁË¡£Ö±½Ó¶¨Òå[ServiceContract]

Èç¹ûÐÞ¸ÄÄ£°åÖÐServiceÃû£¬Global.asaxÖеÄRegisterRoutes·½·¨Ò²±ØÐëÏàÓ¦µÄÐ޸ġ£

ÏÂÃæÊÇ·þÎñµÄʵÏÖ£º

[ServiceContract]  
2.[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3.[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, Namespace="")]
4.public class ImageService
5.{
6. [WebGet(UriTemplate = "{image}")]
7. public Stream GetImage(string image)
8. {
9. var imageType = Path.GetExtension(image).TrimStart('.');
10. WebOperationContext.Current.OutgoingResponse.ContentType = "image/" + imageType;
11. var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");
12. var file = Path.Combine(dir, image);
13. return File.OpenRead(file);
14. }
15.
16. [WebInvoke(UriTemplate = "Add/{image}", Method="POST")]
17. public void AddImage(Stream stream, string image)
18. {
19. var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");
20. var file = Path.Combine(dir, image);
21. var bitmap = Bitmap.FromStream(stream);
22. bitmap.Save(file);
23. }
24.
25. [WebGet(UriTemplate = "ListAll", ResponseFormat=WebMessageFormat.Xml)]
26. public string[] GetAllImageNames()
27. {
28. var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");
29. var files = Directory.GetFiles(dir);
30. var images = new List<string>();
31. foreach (var file in files)
32. {
33. var ext = Path.GetExtension(file);
34. if (ext == ".jpg" || ext == ".gif")
35. images.Add(file);
36. }
37. for (int i = 0; i < images.Count; i++)
38. images[i] = Path.GetFileName(images[i]);
39. return images.ToArray();
40. }
41.}

- GetImage ÓÃÓÚ·µ»ØÍ¼Æ¬ Stream£¬

- AddImage ÓÃÓÚ½ÓÊÜͼƬ Stream ²¢±£´æ£¬

- GetAllImageNames ·µ»ØËùÓÐͼƬÃû¡£

ÔÚHttpЭÒéÖУ¬Í¨¹ýcontent-type¿ØÖƿͻ§¶ËµÄ½âÎöÐÐΪ¡£µ±content-typeÊÇ"image/jpg"»òÕßÊÇ"image/gif"µÄʱºò£¬ä¯ÀÀÆ÷¾ÍÄܹ»Ö±½ÓÏÔʾͼƬÁË¡£Òò´Ë£¬ÔÚ´úÂëÀïÓÐÕâÑùµÄÉ趨£º

WebOperationContext.Current.OutgoingResponse.ContentType = "image/" + imageType;

»¹¿ÉÒÔͨ¹ý OutgoingResponse.Header ¿ØÖÆ»º´æ¡£ÁíÍ⣬Õâ¸öREST WCFÊǽ¨Á¢ÔÚÒ»¸öWeb ApplicationÖУ¬

ÎÒÃÇ»¹¿ÉÒÔÀûÓà System.Web.HttpContext.Current.Server.MapPath ·½·¨£¬»ñµÃÎïÀí·¾¶¡£

ÎÒÃÇÖªµÀÒ»°ãµÄWCF·þÎñÖУ¬¿ÉÒÔʵÏÖStreamed´«Êä¡£ÔÚÄÇÖÖ³¡ºÏÏ£¬·þÎñÆõÔ¼±ØÐëµÄ²ÎÊý»òÕß·µ»ØÖµ±ØÐëÊÇStream£¬ÇÒ²»ÄÜÓбðµÄÀàÐ͵IJÎÊý£¨Òª´«µÝ±ðµÄ²ÎÊý¿ÉÒÔͨ¹ýMessageHeader)¡£µ«ÊÇÔÚÉÏÃæµÄʾÀý´úÂëÖУ¬ÎÒ¶¨ÒåµÄ AddImage ¾ÍÓÐÁ½¸ö²ÎÊý£º

Ò»¸öÊÇStream,»¹ÓÐÒ»¸öÊÇstring¡£Õâ¸östring²ÎÊýÆäʵÊÇͨ¹ýurl´«µÝµÄ£º UriTemplate = "Add/{image}"£¬ÇÒÕâÁ½¸ö²ÎÊýûÓÐ˳ÐòÒªÇó¡£

Èç¹ûûÓÐд"{image}"»áÅ׳öÏÂÃæµÄÒì³££¨ÒòΪRequestµÄBodyÒѾ­±»¶¨ÒåΪStream£¬Í¼Æ¬ÃûÖ»ÄÜͨ¹ýUrl´«¹ýÀ´¡££©

Operation 'AddImage' of contract 'ImageService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.

ÔËÐзþÎñ£¬Ö±½ÓÔÚä¯ÀÀÆ÷ÀïÊäÈë·þÎñURL£ºhttp://localhost:3577/ImageService/GIF002.gif ÎÒÃǾͿÉÒÔ¿´µ½½á¹ûÁË¡£

ÁíÍ⣬ÀûÓÃREST WCF·µ»ØÔ­ÉúÁ÷µÄÌØÐÔ£¬ÎÒÃÇÍêÈ«¿ÉÒÔÈ¡´úÒÔǰÔÚ ASP.NET ÖÐרÃÅÉú³ÉÑéÖ¤Âë»òÕßͼƬ¶ÁÈ¡²½ÖèµÄÒ³ÃæÀ࣬ÊDz»ÊǺܷ½±ã£¿

ΪÁËÌåÏÖ REST WCF µÄ±ãÀûÐÔ£¬ ÎÒÉè¼ÆÁËÒ»¸ö WPF µÄ¿Í»§¶Ë£º

¿Í»§¶Ë´úÂ룺

public partial class MainWindow : Window  
2.{
3. public MainWindow()
4. {
5. InitializeComponent();
6. }
7.
8. private void Window_Loaded(object sender, RoutedEventArgs e)
9. {
10. op.RestoreDirectory = true;
11. op.Filter = "Jpeg Files(*.jpg)|*.jpg|Gif Files(*.gif)|*.gif";
12.
13. BindData();
14. }
15.
16. private void BindData()
17. {
18. var url = "http://localhost:3577/ImageService/ListAll";
19. var client = new HttpClient();
20. var stream = client.Get(url).Content.ReadAsStream();
21. var dataSer = new DataContractSerializer(typeof(string[]));
22. var obj = (string[])dataSer.ReadObject(stream);
23. this.listBox1.DataContext = obj;
24. }
25.
26. private Microsoft.Win32.OpenFileDialog op = new Microsoft.Win32.OpenFileDialog();
27.
28. private void button1_Click(object sender, RoutedEventArgs e)
29. {
30. var ret = op.ShowDialog();
31. if (!ret.HasValue || !ret.Value || !op.CheckFileExists) return;
32. var file = op.FileName;
33. var name = System.IO.Path.GetFileName(file);
34. var url = "http://localhost:3577/ImageService/Add/" + name;
35. var client = new HttpClient();
36. var content = HttpContent.Create(File.OpenRead(file));
37. var resp = client.Post(url, content);
38. resp.EnsureStatusIsSuccessful();
39.
40. BindData();
41. }
42.
43. private void button2_Click(object sender, RoutedEventArgs e)
44. {
45. this.Close();
46. }
47.}
48.
49.[ValueConversion(typeof(string), typeof(string))]
50.public class UriConverter : IValueConverter
51.{
52. public object Convert(object value, Type targetType,
53. object parameter, System.Globalization.CultureInfo culture)
54. {
55. if (value == null) return null;
56. string sourceValue = value.ToString();
57. return "http://localhost:3577/ImageService/" + sourceValue;
58. }
59.
60. public object ConvertBack(object value, Type targetType,
61. object parameter, System.Globalization.CultureInfo culture)
62. {
63. return value;
64. }
65.}

ʵÏÖµÄ×¢Òâµã£º

1) »ñµÃËùÓÐͼƬÃû£¬·þÎñ¶Ë·µ»ØµÄÊÇstring[]µÄÐòÁл¯µÄxml£¬ÓÃDataContractSerializer·´ÐòÁл¯¡£
var dataSer = new DataContractSerializer(typeof(string[]));

2) WPFÖеÄOpenFileDialogÔÚMicrosoft.Win32ÃüÃû¿Õ¼äÏ¡££¨±ØÐëÒýÓÃWindowsBase.dll£©

3) ÀûÓà Microsoft.Http.HttpClient ÉÏ´«Í¼Æ¬, ʵÀý»¯ HttpContent, ͨ¹ýclient.PostÉÏ´«

var url = "http://localhost:3577/ImageService/Add/" + name;
var client = new HttpClient();
var content = HttpContent.Create(File.OpenRead(file));
var resp = client.Post(url, content);
resp.EnsureStatusIsSuccessful();

4) ¶¨ÒåÁËÒ»¸öConverter, ½« ListBox °ó¶¨µ½ Image ¿Ø¼þµÄ Source

Source="{Binding ElementName=listBox1, Path=SelectedItem, Converter={StaticResource uriConv}}"

ÏÂÆª:WCF4.0 ¨C- RESTful WCF Services£¨¶þ£©

   
3568 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹