ASP.NET交互Rest服务接口(Jquery的Get与Post方式)

本文将通过一个简单的实例,介绍如何创建一个Rest服务接口,以及通过JQUERY去对它进行调用;主要采取两种方式分别为Get跟Post;其中将通过Post提交简单类型(Sring)以及复杂类型(自定义实现UserModel)与Rest服务进行交互;

一 Rest服务创建

其中Web客户端(ClintWeb)不对其它层的引用,只通过Rest部署后的服务进行效互;

1:实体层(Model)

using System.Runtime.Serialization;

namespace Model
{
[DataContract]
public class UserModel
{
[DataMember]
public int ID { get; set; } [DataMember]
public string UserName { get; set; } [DataMember]
public string PassWord { get; set; } [DataMember]
public int Age { get; set; } public override string ToString()
{
return string.Format("ID:{0};姓名: {1};年龄:{2};密码:{3}",ID, UserName, Age, PassWord);
}
}
}

此处要注意[DataContract],[DataMember]在命名空间using System.Runtime.Serialization下面;

2:接口层(IServiceInterface)

using System.ServiceModel.Web;
using System.ServiceModel;
using Model;
namespace IServiceInterface
{
[ServiceContract]
public interface IUser
{
[WebGet(UriTemplate = "/{ID}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
UserModel GetUserFromID(string ID); [WebGet(UriTemplate = "All", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
List<UserModel> GetAllUser(); [WebInvoke(UriTemplate = "/User/UserName", Method = "POST", RequestFormat = WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
String GetUserName(string Name); [WebInvoke(UriTemplate = "/User/Post", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string UpdateUser(UserModel model);
}
}

3:逻辑层(ServiceBll)

using IServiceInterface;
using Model;
namespace ServiceBll
{
public class UserBll:IUser
{
public static List<UserModel> GetUserList()
{
List<UserModel> list = new List<UserModel>()
{
new UserModel(){ID=1,UserName="踏浪帅",PassWord="123456",Age=27}, new UserModel(){ID=2,UserName="wujunyang",PassWord="345678",Age=30},
new UserModel(){ID=3,UserName="cnblogs",PassWord="987654",Age=33}
};
return list;
} public UserModel GetUserFromID(string ID)
{
UserModel item = GetUserList().Where(a => a.ID == int.Parse(ID)).SingleOrDefault();
if (item != null)
{
return item;
}
else
{
return new UserModel();
}
} public List<UserModel> GetAllUser()
{
return GetUserList();
} public string UpdateUser(UserModel model)
{
return model.ToString();
} public String GetUserName(string Name)
{
return "您好:" + Name;
}
}
}

后面创建的客户端传参数要跟上面各个方法的参数相同,比如:Name,model等

4:Rest服务(RestService)

此处新建一个文本文件把它修改成.svc格式,在其里面写入:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceBll.UserBll" %>

web.config文件内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MapConfigBehavior">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webHttpBindConfig" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/>
<security mode="None"></security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="ServiceBll.UserBll" behaviorConfiguration="MapConfigBehavior">
<endpoint binding="webHttpBinding" contract="IServiceInterface.IUser" bindingConfiguration="webHttpBindConfig" behaviorConfiguration="webHttp"/>
</service>
</services>
</system.serviceModel>
</configuration>

通过上面的代码我们便简单完成一个Rest服务的创建,接着我们把它发布在IIS里面;进一步可以为客户端进行调用做准备;

二 客户端Web调用服务

客户端主要运用JQUERY的Ajax进行服务调用;

1:通过Get方式进行调用返回单个实例的JSON:

                $.ajax({
type: "get",
contentType: "application/json; charset=utf-8",
url: "http://localhost:8089/WcfRestService.svc/1",
success: function (userInfo) {
alert("用户名:" + userInfo.UserName + " 密码:" + userInfo.PassWord + " 年龄:" + userInfo.Age);
},
error: function (error) {
alert("出错:" + error.responseText);
}
});

运行效果:

2:通过Get方式进行调用返回列表实例的JSON

                $.ajax({
type: "get",
contentType: "application/json; charset=utf-8",
url: "http://localhost:8089/WcfRestService.svc/All",
success: function (userlist) {
$.each(userlist.GetAllUserResult, function (item, value) {
alert(value.ID + "|" + value.UserName + "|" + value.PassWord + "|" + value.Age);
})
}
});

运行效果:

其中要注意要从结果userlist.GetAllUserResult进行循环,我们可以能过IE的F12进行查看,不难发现是跟我们接口服务名称有关的 对应接口名称+Result  此处我们的定义接口名称为GetAllUser

3:通过Post方式进行简单类型的交互

                var UserMsg = { 'Name': '踏浪帅' };
var UserMessage = JSON2.stringify(UserMsg);
$.ajax({
type: "POST",
contentType: "application/json",
url: "http://localhost:8089/WcfRestService.svc/User/UserName",
data: UserMessage,
dataType: "json",
crossDomain: false,
success: function (userNameInfo) {
alert(userNameInfo);
},
error: function (error) {
alert(error.responseText);
}
});

运行效果:

其中要注意var UserMsg = { 'Name': '踏浪帅' }; "Name"必需要跟Rest服务接口的参数是一样;JSON2.stringify(UserMsg)则是把它转化成JSON格式,其定义在json2.js里;

4:通过Post方式进行复杂类型(自定义实体)的交互

                var UserMsg = { 'model': { 'ID': '6', 'UserName': '踏浪帅', 'PassWord': '123456', 'Age': '27'} };
var UserMessage = JSON2.stringify(UserMsg);
$.ajax({
type: "POST",
contentType: "application/json",
url: "http://localhost:8089/WcfRestService.svc/User/Post",
data: UserMessage,
dataType: "json",
crossDomain: false,
success: function (userNameInfo) {
alert(userNameInfo);
},
error: function (error) {
alert(error.responseText);
}
});

运行效果:

其中要注意交互实体的书写方式,其中model是我们Rest服务接口定义的参数,其它则是实体的名称和对应的值,都是以字符串格式;特别要注意接口服务中采用Post的BodyStyle= WebMessageBodyStyle.WrappedRequest;这个问题困惑好几天,最后发现把它设置成BodyStyle = WebMessageBodyStyle.Bare;服务接口就一直交互失败;

三 理论知识

1:接口服务中的WebMessageBodyStyle枚举,首先我们先看一下它几个值

    // 一个指定是否包装参数和返回值的枚举。
public enum WebMessageBodyStyle
{
// 摘要: 不包装请求和响应。
Bare = 0, // 摘要:包装请求和响应。
Wrapped = 1, // 摘要:包装请求,但不包装响应。
WrappedRequest = 2, // 摘要:包装响应,但不包装请求。
WrappedResponse = 3,
}

先前一直Post交互失败,就是因为对枚举了解不够,导致一直查找不出错误的所在地方;这边引用一下蒋老师的文章来说明几个的区别:请求消息和回复消息分别是对操作方法输入参数和返回值(输出参数和引用参数)的封装,WebMessageBodyStyle中的Bare表示请求消息和回复消息的主体部分仅仅包含针对输入参数和返回值(输出参数和引用参数)序列化后的内容,而Wrapped则会在外面包装一个基于当前操作的“封套”。枚举项WrappedRequest和WrappedResponse用于单独针对请求消息和回复消息的主体进行封装。WebGetAttribute与WebInvokeAttribute的属性BodyStyle的默认值为Bare。如果该属性被设置成WrappedRequest,则回复消息主体依然采用Bare风格;
如果该属性被设置成WrappedResponse,则请求消息主体依然采用Bare风格。布尔类型的只读属性IsBodyStyleSetExplicitly表示是否针对属性BodyStyle进行了显示设置。在使用POST操作时,在客户端与服务端交互过程中,需要指定WebMessageBodyStyle;在GET操作时,不论格式,可以不必指定。

四 工具运用

在上面创建的服务中定义Get及Post方式进行调用服务,其实我们也可以通过Fiddler来模拟交互;

1:选择Get方式,并把服务的地址写入,然后Execute

选择运行完的Web会话,在"嗅探"->"TextView",可以看到调用服务返回的内容

2:选择Post方式,并把服务的地址写入,在Request Headers写入"Content-Type:application/json"  在RequestBody写入要传递给服务的参数和值

执行后返回的结果如下:

复杂类型的Post方式

执行后返回的结果如下:

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮,若有不足欢迎指正。  因为,我的写作热情也离不开您的肯定支持。
 
感谢您的阅读(源代码下载

 
 
 
标签: WCF

ASP.NET交互Rest服务接口(Jquery的Get与Post方式)的更多相关文章

  1. 记录ASP.NET Web API 服务接口响应时间

    实现起来很简单,一个Filter就可以搞定!!! /// <summary> /// 监控接口执行时间 /// </summary> public class TimingAc ...

  2. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  3. 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  4. ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性

    一.背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi.在我们平时开发项目中可能会出现下面这些情况; 1).由于用户误操作,多次点击网页表单提交按钮.由于网速等原因造成页面卡顿,用户重复刷新 ...

  5. ASP.NET WebAPI构建API接口服务实战演练

    一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...

  6. Asp.Net Core微服务再体验

    ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...

  7. Asp.Net Core微服务初体验

    ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...

  8. 第6章 服务模式 Service Interface(服务接口)

    Service Interface(服务接口) 上下文 您正在设计企业应用程序,并且需要能够通过网络使用其部分功能.此功能需要能够被各类系统使用,因此互操作性是设计的重要方面.除互操作性之外,可能还需 ...

  9. Dubbo服务接口的设计原则

    1.接口粒度 1.1 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持.同时可以减少系统间的网络交互. 1.2 服务 ...

随机推荐

  1. 深入探讨 Java 类加载器[转]

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器(class loader)是 Java™ ...

  2. Func和Action的用法区别

    平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...

  3. 注册 集 与 删除 -- C

    文章3位设置和清除操作. #include <stdio.h> #include <stdlib.h> #include <string.h> #define BI ...

  4. Linux下Nagios

    Linux下Nagios的安装与配置   一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机 ...

  5. 数据库数据导出成XML文件

    在数据库中,怎样把库中的数据导出XML文件, sql语句如下: SELECT *  FROM 表名 FOR XML AUTO, ELEMENTS

  6. Highcharts图表导出为pdf的JavaWeb实践

    写给读者的话^_^: 众所周知,基于Highcharts插件生成的svg图片组(注意这里鄙人指的组是若干图有序组合,并非一张图片,具有业务意义)导出为PDF文档是有难度滴.鄙人也曾“异想天开”用前端技 ...

  7. C# winform调用WebBrowser经典怪问题总结

    原文:C# winform调用WebBrowser经典怪问题总结 最近一直研究网页数据采集,单单采集数据,其实HtmlAgilityPack就足够了. 对HtmlAgilityPack感兴趣的可以到这 ...

  8. PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  9. MVC5 + EF6 + Bootstrap3 (8) HtmlHelper

    MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 上一节:MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统 源码下载:点我 ...

  10. 方向梯度直方图(HOG)和颜色直方图的一些比較

    近期在学习视频检索领域的镜头切割方面的知识,发现经常使用的方法是直方图的方法,所以才专门有时间来学习下.查看到这两种直方图的时候,感觉有点接近,好像又不同,放在这做个比較.大部分还是百科的内容,只是对 ...