1:修改App_Start/WebApiConfig.cs文件,使用json以及修改路由
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Net.Http.Formatting; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; namespace WebAPI { public static class WebApiConfig { public static void Register(HttpConfiguration config) { #region json formatter(bryan add) // Web API configuration and services var json = config.Formatters.JsonFormatter; // 解决json序列化时的循环引用问题 json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 删除XML序列化器 config.Formatters.Remove(config.Formatters.XmlFormatter); var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); #endregion // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", //routeTemplate: "api/{controller}/{id}", //bryan add {action} routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } } }
2:实现跨域调用
1)使用nuget安装Microsoft.AspNet.WebApi.Cors,安装的时候切记指定-Version 5.0.0版本,否则获取的最新5.2.2.0与其它低版本dll无法兼容
相关命令:Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.0.0
2)配置web.config文件
在system.webServer节点添加以下节点
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Max-Age" value="30"/> <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS"/> <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" /> </customHeaders> </httpProtocol>
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Script.Serialization; using System.Text; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using WebAPI.Models; using System.Web.Http.Cors; using System.Web; namespace WebAPI.Controllers { [EnableCors(origins: "*", headers: "*", methods: "*")] public class UserController : ApiController { /// <summary> /// test: http://localhost/yourproject/api/user/TestGet?pID=5&pName=1212 /// </summary> /// <param name="pID"></param> /// <param name="pName"></param> /// <returns></returns> [HttpGet] public HttpResponseMessage TestGet(int pID, String pName) { try { APIResult temp = new APIResult(); temp.ResultCode = 0; temp.ResultMessage = "ok"; temp.ResultContent = "ok content"; TestUser u = new TestUser(); u.ID = pID; u.Name = pName; temp.ResultObject = JsonConvert.SerializeObject(u); temp.ResultObject = JsonConvert.SerializeObject(u); return Request.CreateResponse(HttpStatusCode.OK, temp); } catch (Exception ex) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); } } /// <summary> /// test: http://localhost/yourproject/api/user/TestPost /// </summary> /// <returns></returns> [HttpPost] public HttpResponseMessage TestPost() { try { APIResult temp = new APIResult(); //获取传统context HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"]; //定义传统request对象 HttpRequestBase request = context.Request; //--------------------------------------------- post data start string pd_content = ""; string pd_password = ""; if (request.Form.AllKeys.Contains("pd_content")) { pd_content = request.Form["pd_content"]; byte[] b_pd = Convert.FromBase64String(pd_content); pd_content = Encoding.Default.GetString(b_pd); JObject jo = (JObject)JsonConvert.DeserializeObject(pd_content); if (jo["password"] != null) { pd_password = jo["password"].ToString(); } else { temp.ResultCode = 1; temp.ResultMessage = "password not found."; } } //--------------------------------------------- post data end temp.ResultCode = 1; temp.ResultMessage = pd_password; return Request.CreateResponse(HttpStatusCode.OK, temp); } catch (Exception ex) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); } } } }
4:开发ajax调用测试(php)
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <link href="jquery-ui/css/jquery-ui-1.10.1.custom.css" rel="stylesheet"> <script src="jquery-ui/jquery-1.9.1.js"></script> <script src="jquery-ui/jquery-ui-1.10.1.custom.js"></script> <link href="jquery-ui/css/jquery-ui-1.10.1.custom.css" rel="stylesheet"> <script src="jquery-ui/jquery-1.9.1.js"></script> <script src="jquery-ui/jquery-ui-1.10.1.custom.js"></script> <?php function createjs() { $arr_json = Array(); $arr_json["password"] = "000000"; return json_encode($arr_json); } $s_json = createjs(); $s_b64 = base64_encode($s_json); ?> <script type="text/javascript"> var s_b64 = "<?php echo $s_b64;?>"; /** * api/user/Register_CheckPassword */ function apiTest() { $('#div_error').html(""); //本地ajax調用 var myurl = "http://localhost/yourproject/api/user/TestPost"; $('#div_loading').html("<img src='loading.gif'>"); $.ajax({ type:"post", //请求方式 url:myurl, //发送请求地址 crossDomain: true, data:{ pd_content: s_b64 }, dataType:"json", //请求成功后的回调函数有两个参数 success:function(data,textStatus){ var jsonstr = JSON.stringify(data); $("#div_test").html(jsonstr); }, //请求失败时将调用此方法 error:function(XMLHttpRequest, textStatus, errorThrown) { $('#div_error').html("<lable style=\"color: #FF0000;\">network error,please try again.</lable>"); }, //请求完成后回调函数 (请求成功或失败时均调用) complete:function(XMLHttpRequest,textStatus){ $('#div_loading').html(""); } }); } </script> <div> <a href="javascript:apiTest();">test</a> </div> <div id="div_error"></div> <br> <div id="div_test"></div> <br> <div id="div_loading" style="width:16px;height:16px;"/>