它是一个传统的 ASP.NET MVC 控制器。它只是负责处理站点的HTML页,跟Web API没有直接关系。
手动添加一个API控制器
选择包含空读/写操作的API控制器,然后添加。
添加完后可看到空白的控制器代码,然后根据需要补充逻辑需求。
例:
using MFirstWAPI.Models;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
using System.Web.Script.Serialization;
namespace MFirstWAPI.Controllers
{
public class UsersController : ApiController
{
// GET api/values
public IEnumerable<Users> Get()
{
List<Users> listUser = new List<Users>();
MySqlConnection mysql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from user",mysql);
mysql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
Users user = new Users();
user.UserID = reader.GetInt32("ID");
user.UserName = reader.GetString("username");
user.UserEmail = reader.GetString("useremail");
listUser.Add(user);
}
}
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
mysql.Close();
}
return listUser;
}
// GET api/Users/5
public Users GetUserByID(int id)
{
Users user = new Users();
MySqlConnection mysql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from USER where ID=" + id, mysql);
mysql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
user.UserID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.UserEmail = reader.GetString(2);
}
}
reader.Close();
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
reader.Close();
}
return user;
}
//GET api/Users/?username=xx
public IEnumerable<Users> GetUserByName(string userName)
{
List<Users> listuser = new List<Users>();
MySqlConnection msql = getMySqlConnection();
MySqlCommand mySqlCommand = getSqlCommand("select * from USER where username like'%" + userName+"%'",msql);
msql.Open();
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
while (reader.Read())
{
if (reader.HasRows)
{
Users user = new Users();
user.UserID = reader.GetInt32("ID");
user.UserName = reader.GetString("USERNAME");
user.UserEmail = reader.GetString("USEREMAIL");
listuser.Add(user);
}
}
reader.Close();
}
catch
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
finally
{
reader.Close();
}
return listuser;
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
private static MySqlConnection getMySqlConnection()
{
MySqlConnection mysql = new MySqlConnection(ConfigurationManager.ConnectionStrings["MySqlConnection"].ConnectionString);
return mysql;
}
public static MySqlCommand getSqlCommand(String sql, MySqlConnection mysql)
{
MySqlCommand mySqlCommand = new MySqlCommand(sql, mysql);
return mySqlCommand;
}
}
}
此处代码,主要补充了Get方法的逻辑。数据从mysql数据库中获取。例中MySql对应user表中数据如下
获取数据共写了三个get方法,第一个是获取所有user数据,
第二个根据Users 的ID获取对应Users,第三个根据UserName获取Users。为了能够通过MySql获取数据,需要在Web.config的<connectionStrings>节点中添加
<add name="" providerName="System.Data.SqlClient" connectionString=""/>
name为connectionString对应名称,connectionString中为连接mysql的配置
代码中通过ConfigurationManager.ConnectionStrings["name"].ConnectionString获取mysql配置。
完成代码编写后,即可对进行代码测试。如果需要部署到IIS,则需要发布网站,然后配置IIS,需要注意的是IIS应用程序池需要
.net FramWork版本为4.0。否则部署不成功。
Chorm通过 IIS获取数据如下:
四、修改返回数据JSON非XML
如果不修改返回数据类型,chrome中默认返回的数据并不是以上图片所示数据格式,而是XML类型,IE下返回的数据位JSON格式。
那么如何修改只返回JSON而屏蔽掉,百度后会有很多实例,本例使用的是通过使用自定义的只返回Json Result的content negotiation代替Web Api中默认的content negotiation。Conneg通过实现IContentNegotiator的Negotiator方法实现扩展。Negotiator方法返回ContentNegotiationResult(它包装了你选择的headers和formatter)。
下面的方法通过传递一个JsonMediaTypeFormatter给自定义的conneg negotiator,让它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。这种方法避免了每次请求都要重新创建一次formatter。
方法如下:
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}
然后接下来,需要在HttpConfiguration
实例上注册新的实现机制,在App_Start下找到WebApiConfig.cs添加代码,添加完后代码如下
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new MFirstWAPI.Controllers.UsersController.JsonContentNegotiator(jsonFormatter));
}
}
红色部分为新加代码
最后编译发布,通过Chrome浏览器获取数据为JSON格式了。