如何调用基于iis的jquery wcf restt service

&&&&& 表述性状态转移(Representational State Transfer,REST),不是一种标准,而是一种软件架构风格。
&&&&& 基于REST的服务与基于SOAP的服务相比,性能、效率和易用性上都更高,而SOAP协议非常的复杂和不透明。REST受到越来越多的Web服务供应商欢迎。目前大部分供应商,如yahoo、google、Amazon等都提供REST风格的服务。
&&&&& REST的主要原则是:
&1.网络上的所有事物都可被抽象为资源;
&2.每个资源都有一个唯一的资源标识符URI;
&3.使用标准方法操作资源;
&4.所有的操作都是无状态的;
&5.通过缓存来提高性能。
&&&&REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。Http把对一个资源的操作限制在4个方法以内:GET、POST、PUT和DELETE,这正是对资源CRUD操作的实现。
&&& REST的资源表述形式可以是XML、HTML、JSON,或者其他任意的形式,这取决于服务提供商和消费服务的用户。
&&& 但是REST不是万能的。操作无状态也会带来巨大的安全问题,如何授权和验证用户?如果要求每次请求都包含完整的身份和验证信息,又如何避免信息泄漏?复杂的功能挑战架构的易用性,这就需要在性能与功能间权衡,究竟该用REST还是SOAP。
WebHttpBinding
&&&&& WebHttpBinding允许开发人员通过 HTTP 请求(这些请求使用&Plain old XML&(POX) 样式消息,而不是使用基于 SOAP 的消息)来公开 Web 服务,可以很便利的实现REST。
&&&&& 与其他绑定不同的是:必须使用WebHttpBehavior对服务的终结点进行配置。还要求使用WebGetAttribute或WebInvokeAttribute属性将各个服务操作映射到 URI,同时定义调用和返回结果的消息格式。
&&&&& 先定义服务契约。
&&&&& 这里提供两个方法,分别采用GET和POST方式访问。
&&&&& 我们可以看到,与普通WCF服务契约不同的是,需要额外用WebGet或者WebInvoke指定REST访问的方式。另外还要指定消息包装样式和消息格式,默认的消息请求和响应格式为XML,若选择JSON需要显式声明。&
&&&&& UriTemplate用来将方法映射到具体的Uri上,但如果不指定映射,将映射到默认的Uri。比如采用Get访问的GetUser方法,默认映射是:/GetUser?Name={Name}&Position={Position}。
1 namespace Rest.Contract 2 { 3
[DataContractFormat] 4
[ServiceContract] 5
public interface ITest 6
//[WebGet(UriTemplate = "/User/Get/{Name}/{Position}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 8 &
[WebGet(UriTemplate = "/User/Get/{Name}/{Position}", BodyStyle = WebMessageBodyStyle.Bare)] 9
[OperationContract]10
List&User& GetUser(string Name, string Position);11 12
//[WebInvoke(Method = "POST", UriTemplate = "/User/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]13 &
[WebInvoke(Method = "POST", UriTemplate = "/User/Create", BodyStyle = WebMessageBodyStyle.Bare)]14
[OperationContract]15
Result CreateUser(User u);16
[DataContract(Namespace = "http://rest-server/datacontract/user")]19
public class User20
[DataMember]22
public long ID { get; set; }23 24
[DataMember] 25
public string Name { get; set; }26 27
[DataMember]28
public int
Sex { get; set; }29 30
[DataMember]31
public string Position { get; set; }32 33
[DataMember]34
public string Email { get; set; }35
[DataContract(Namespace = "http://rest-server/datacontract/result")]38
public class Result39
[DataMember]41
public string Value { get; set; }42
}43 44 }45 &
&&&&& 这里最简单的实现GetUser和CreateUser两个方法的逻辑,关注点不在这里。
1 namespace Rest.Service 2 { 3
public class Test : ITest 4
/// &summary& 6
/// &/summary& 8
/// &param name="Name"&&/param& 9
/// &param name="Position"&&/param&10
/// &returns&&/returns&11 &
public List&User& GetUser(string Name, string Position)12
List&User& userList = List.Where(u =& u.Name == Name && u.Position == Position).ToList();14 15
return userL16
/// &summary&19
/// POST20
/// &/summary&21
/// &param name="u"&&/param&22
/// &returns&&/returns&23 &
public Result CreateUser(User u)24
Result result = new Result();26
if (!List.Any(user =& user.ID == u.ID))28
List.Add(u);29 30
result.Value = u.ID.ToString();31 32
/// &summary&36
/// 测试数据37
/// &/summary&38 &
private static List&User& List39
List&User& list = new List&User&{43
new User{44
ID = 19735,45
Name = "wuhong",46
Sex = 1,47
Position = "engineer",48
Email = "star_"49
&服务端的配置文件中只有一个特别处,必须使用WebHttpBehavior对服务的终结点进行配置。
Web.Config
&system.serviceModel& 2
&bindings& 3
&webHttpBinding& 4
&binding name="webBinding"& 5
&/binding& 6
&/webHttpBinding& 7
&/bindings& 8
&services& 9
&service name="Rest.Service.Test" behaviorConfiguration="testServiceBehavior"&10
&endpoint address="" behaviorConfiguration="webBehavior" 11
binding="webHttpBinding" bindingConfiguration="webBinding" contract="Wuhong.Rest.Contract.ITest"&12
&/endpoint&13
&/service&14
&/services&15
&behaviors&16
&endpointBehaviors&17
&behavior name="webBehavior"&18
&!--这里必须设置--&19
&webHttp /&20
&/behavior&21
&/endpointBehaviors&22
&serviceBehaviors&23
&behavior name="testServiceBehavior"&24
&/behavior&25
&/serviceBehaviors&26
&/behaviors&27
&/system.serviceModel&28 &
&&&& 为了强调REST的通用性,客户端不用WCF的形式调用服务,而是用另外两种通用的方式:
&&&& 一是用C#编程直接HTTP访问,消息格式我们选XML;
&&&&&& 二是用jquery实现GET和POST访问,消息格式我们选JSON。
&&&&&& 先实现C#方式,我们封装一个Client类,实现HTTP的GET和POST方式。
1 namespace Rest.Client 2 { 3
public class RestClient 4
/// &summary& 6
/// 构造函数 7
/// &/summary& 8
/// &param name="baseUrl"&&/param& 9 &
public RestClient(string baseUri)10
this.BaseUri = baseU12
/// &summary&15
/// 基地址16
/// &/summary&17 &
private string BaseU18 19
/// &summary&20
/// Post调用21
/// &/summary&22
/// &param name="data"&&/param&23
/// &param name="uri"&&/param&24
/// &returns&&/returns&25 &
public string Post(string data, string uri)26
//Web访问对象28 &
string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);29
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);30 31
//转成网络流32 &
byte[] buf = UnicodeEncoding.UTF8.GetBytes(data);33 34
//设置35 &
myRequest.Method = "POST";36
myRequest.ContentLength = buf.L37
myRequest.ContentType = "text/html";38 39
// 发送请求40 &
Stream newStream = myRequest.GetRequestStream();41
newStream.Write(buf, 0, buf.Length);42
newStream.Close();43 44
// 获得接口返回值45 &
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();46
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);47 48
string ReturnXml = HttpUtility.HtmlDecode(reader.ReadToEnd());49 50
reader.Close();51
myResponse.Close();52 53
return ReturnX54
/// &summary&57
/// Get调用58
/// &/summary&59
/// &param name="uri"&&/param&60
/// &returns&&/returns&61 &
public string Get(string uri)62
//Web访问对象64 &
string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);65
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);66 67
// 获得接口返回值68 &
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();69
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);70 71
string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd());72 73
reader.Close();74
myResponse.Close();75 76
return ReturnX77
&&&&& 下面是主函数,按顺序调用两个接口,并显示返回值。需要注意XML约定的命名空间:
Client Main函数
1 namespace Rest.Client 2 { 3
class Program 4
static void Main(string[] args) 6
//初始化 8 &
RestClient client = new RestClient(ClientConfiguration.ServiceUrl); 9 10
string uriGet = string.Format("User/Get/{0}/{1}", "wuhong", "engineer");12
string retGet = client.Get(uriGet);13 14
Console.WriteLine(retGet);15 16
//Post17 &
string uriPost = "User/Create";18
string data = "&User xmlns=\"http://rest-server/datacontract/user\"&&ID&19735&/ID&&Name&wuhong&/Name&&Sex&1&/Sex&&Position&engineer&/Position&&Email&star_&/Email&&/User&";19 &20
string retPost = client.Post(data, uriPost);21 22
Console.WriteLine(retPost);23 24
Console.ReadLine();25
}27 28 }29 &
&&&&& 结果:
&&&&& 接下来实现javascript方式。
&&&&& 这里采用jquery访问REST服务,为了javascript操作数据的便利,消息格式选择JSON,可以忽略数据契约的命名空间。不过需要服务契约做一点修改,显式指定请求或响应消息的格式,例如:&
1 [WebInvoke(Method = "POST", UriTemplate = "User/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
&&&&& Html代码:&
js client代码
1 &html& 2
&script src="jquery-1.3.2.min.js" type="text/javascript"&&/script& 4
&script type="text/javascript"& 5
function HttpGet() { 6
$.get(&http://doxt-wuhong/Wuhong.Rest.Web/TestService.svc/User/Get/wuhong/engineer&, 7
function(data) { 8
$("#TextGet").val(data); 9
function HttpPost() {12
var str = "{ \"Email\": \"star_\", \"ID\": 19735, \"Name\": \"wuhong\", \"Position\": \"engineer\", \"Sex\": 1 }";13
$.ajax({14
type: "POST",15
contentType: "application/json",16
url: &http://doxt-wuhong/Wuhong.Rest.Web/TestService.svc/User/Create,17
data: str,18
success: function(data) {19
$("#TextPost").val(data);20
&/script&24
&style type="text/css"&25
#TextGet26
width: 700px;28
#TextPost30
width: 700px;32
&/style&34
&input id="ButtonGet" type="button" value="GET" onclick="HttpGet()" /&37
&input id="TextGet" type="text" /&38
&input id="ButtonPost" type="button" value="POST" onclick="HttpPost()" /&40
&input id="TextPost" type="text" /&41
&/body&42 &&/html&43 &
&&&&& &结果:
阅读(...) 评论()  最近就要面试了,就把前一段时间学习过的wcf服务又拿出来复习了一边。本来还以为很Easy的东西,谁知道等到真正要做的时候才知道原来有这么多知识要学习!
  先来说,把wcf基本服务完成的过程,我是在园子里看着一点点做起来的。因为之前做过一次的原因,所以说这次做的时候也没有太用心,随随便便的把代码一抄就万事大吉了。可是把代码写完之后,发现调试不成系统提示如下:
当时,也没有想到是程序哪里出问题了,总以为程序照抄的就应该没有问题,可是后来实在是找不到出错的原因,然后上网百度之后才发现,
原来在服务契约定义的时候没有加上这句话
[ServiceContract(Name = "CalculatorService", Namespace = "/")]
&这一点有做一点更正:这一点确实要加【servicecontract】不过不是必须要加(name 和namespace)。这一点谢谢
当时只是一味的抄,也没有注意到它有什么作用,后来转到定义,看了一下
&&&&&&& // 摘要:&&&&&&& //&&&& 获取或设置 Web 服务描述语言 (WSDL) 中的 &portType& 元素的名称。&&&&&&& //&&&&&&& // 返回结果:&&&&&&& //&&&& 默认值为应用了 System.ServiceModel.ServiceContractAttribute 的类或接口的名称。&&&&&&& //
这些其实大家不用管,只要记得把name赋值给实现接口的类就行了,后边的命名空间因该是不使用也没关系(如果你的程序仅仅使用于调试)具体的我也没有深入研究!!
接下来,就是关于IIS的发布了,这可是折麽死我了!!原来老师讲的时候没有好好听讲,现在发愁了。后来还是一点点的试出来的,首先我在建了一个文件夹,里面有一个BIN文件夹,svc文件,web.config三个文件!其中bin文件夹中要使用服务契约的的DLL(接口),和服务契约实现的DLL(接口的实现),svc文件中只有一句话:
&%@ ServiceHost Language="C#" Debug="true" Service="Services.CalculatorService" %&
这句话中只有service=&&这句话有用。service.calculatorservice是服务契约实现的命名空间.实现类!
接下来就是关于web.config的处理了!对于初学者,使用VS中配套的工具编写是非常方便的。首先打开VS-&工具&&WCF服务配置编辑器,点击新建配置文件,服务,新建服务
浏览有服务实现的DLL选中,然后下一步,让后一直下一步就行了。不过有一点要注意,就是在填写终结点地址的时候把输入框清空就行了!
接下来,就是配置服务了,在高级中点击服务行为 点击添加选择
点击servicemetadata,作如下设置
最后把终结点设置如下
把服务添加上点击服务
最后就是保存就行了!最后最重要的就是,因为系统默认的文件名是app.config。但是在这里一定要改名为web.config,因为我们是要用IIS发布的,而不是应用程序了。这一点很重要,刚开始就是因为这一点,让我耽误了不少时间。最后就是用IIs发布了。
打开IIs之后,将文件夹设为默认网站,点击svc文件浏览,就得到已下结果!
把这个超链接&?&之前的都复制下来!然后就是客户端的调用了
在客户端的&引用中左键添加服务引用如下图
然后,点击确定就行了!!
这时候,在debug中运行客户端应用程序,是不是就可以运行了。这样根本就不用运行服务端,不过其实也是运行了的,只要你不关机服务器就运行着!!神奇吧!!
哈哈,写了半天,终于写完了。因为本人是新人,其中有一些地方写的不对,或者有缺陷,都请园子里的朋友们多多指正!!
阅读(...) 评论()iPhone中调用WCF RESTFUL Service
在前面的一篇文章:中讲述的如何在iPhone中调用WCF服务。我现在开发是调用webservice的,方式和那篇文章一样。需要定义soap,然后异步去调用服务端的方法,等服务端执行完成,然后在iPhone客户端接受返回的XML,最后解析返回的XML。这种方式用起来非常的不方便,每一次调用即需要写自定义的soap,又要解析XML。这篇文章我将讲述一下如何调用restful方式的WCF服务。
REST(Resentational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。使用WCF创建restful分格的服务是非常方便的。这篇文章,我通过一个demo来展示如何在iPhone中调用wcf restful service。
创建一个wcf restful service。
1、创建一个数据交换实体类
/// &summary&
/// User实体类
/// &/summary&
[DataContract]
public class User
/// &summary&
/// 用户名
/// &/summary&
[DataMember(Order = )]
public string Name { }
/// &summary&
/// &/summary&
[DataMember(Order = 1 )]
public string DayOfbirth { }
2、服务契约:定义了三个方法,分别用来获取用户的XML格式、json格式以及创建用户。
[ServiceContract]
public interface IService1
/// &summary&
/// 创建用户
/// &/summary&
/// &summary&
/// 获取用户信息,json格式
/// &/summary&
/// &param name="name"& 用户名 &/param&
[OperationContract]
UriTemplate = " User/{name} " ,
ResponseFormat = WebMessageFormat.Json)]
User GetUser( string name);
/// &summary&
/// 获取用户信息,XML格式
/// &/summary&
/// &param name="name"& 用户名 &/param&
/// &remarks&
/// &/remarks&
[OperationContract]
UriTemplate = " UserXML/{name} " ,
ResponseFormat = WebMessageFormat.Xml)]
User GetUserXML( string name);
/// &summary&
/// 创建用户信息
/// &/summary&
/// &param name="name"& 用户名 &/param&
/// &param name="dayOfbirth"& 生日 &/param&
/// &returns&&/returns&
[OperationContract]
[WebInvoke(UriTemplate = " User/{name}/{dayOfbirth} " ,
Method = " POST " ,
ResponseFormat = WebMessageFormat.Json)]
User CreateUser( string name, string dayOfbirth);
3、服务实现:这里简单处理。
public class Service1 : IService1
public User GetUser( string name)
return new User { Name = name, DayOfbirth = new DateTime( 1986 , 10 , 23 ).ToString() };
public User GetUserXML( string name)
return new User { Name = name, DayOfbirth = new DateTime( 1986 , 10 , 23 ).ToString() };
public User CreateUser( string name, string dayOfbirth)
return new User { Name = name, DayOfbirth = dayOfbirth };
4、对于vs2008创建的wcf服务,需要在.svc文件中加入下面代码:
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
5、在web.config中将绑定方式改成webHttpBinding
6、在iis发布服务。
iPhone客户端调用:
这里使用ASIHTTPRequest,它是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装,非常的好用。
在xcode中拖一个简单的界面,如下图,分别调用服务端的三个方法:
定义下面三个方法与三个button的点击事件对应:
- (IBAction)fetchXML:(id)
- (IBAction)fetchJson:(id)
- (IBAction)createJson:(id)
三个点击事件的具体实现:下面的代码为了简单起见,直接将xml和json输入。比较好的做法是:在iPhone也定义一个User类,将json或者XML转换为User实体对象。
- (IBAction)fetchXML:(id)sender
NSURL * url = [NSURL URLWithString: @" http://10.5.23.117:21924/Service1.svc/UserXML/zhuqilin " ];
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError * error = [request error];
if ( ! error) {
NSString * response = [request responseString];
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @" xml格式 "
message:response
delegate :nil
cancelButtonTitle: @" OK "
otherButtonTitles:nil];
[alertView show];
[alertView release];
- (IBAction)fetchJson:(id)sender
NSURL * url = [NSURL URLWithString: @" http://10.5.23.117:21924/Service1.svc/User/zhuqilin " ];
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError * error = [request error];
if ( ! error) {
NSString * response = [request responseString];
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @" JSON格式 "
message:response
delegate :nil
cancelButtonTitle: @" OK "
otherButtonTitles:nil];
[alertView show];
[alertView release];
- (IBAction)createJson:(id)sender
NSURL * url = [NSURL URLWithString: @" http://10.5.23.117:21924/Service1.svc/User/zhuqilin/ " ];
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod: @" POST " ];
[request startSynchronous];
NSError * error = [request error];
if ( ! error) {
NSString * response = [request responseString];
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @" 创建用户 "
message:response
delegate :nil
cancelButtonTitle: @" OK "
otherButtonTitles:nil];
[alertView show];
[alertView release];
输出结果:
1、获取json格式的数据
2、获取xml格式的数据
3、创建一个用户实体:
总结:本文通过一个简单的例子说明了如何在iPhone中调用wcf restful服务。你会感觉到这个方式,比去定义soap去调用要好很多,如果你有更方便的方式,请一定要告诉我哈。
本文代码:
原文链接:
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.039 (s). 10 q(s)安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&

我要回帖

更多关于 wcf rest service 的文章

 

随机推荐