asp.net webapi 无法使用多个post,浏览器不支持put delete,405错误
asp.net mvc .net framework中使用 webapi ,无法使用多个post,并且浏览器并不是全支持put和delete。
解决方法:首先改变微软提供的webapi默认配置路由:
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web;
using System.Web.Http;
namespace EasyUICRUD.App_Start
{
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// 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();
// Web API 路由
config.MapHttpAttributeRoutes();
//config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{action}/{id}",
// defaults: new { id = RouteParameter.Optional }
//);
}
}
}
或者直接注释掉,用特性路由。再使用[HttpPost]代替put和delete。如果不配置路由,会报错找不到合适的api。
public class UsersController : ApiController
{
private EasyUICRUDContext db = new EasyUICRUDContext();
// GET: api/Users
[HttpGet]
[Route("user/getall")]
public IQueryable<User> GetUsers()
{
return db.Users;
}
// GET: api/Users/5
[HttpGet]
[Route("user/get")]
public IHttpActionResult GetUser(int id)
{
User user = db.Users.Find(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
// PUT: api/Users/5
[HttpPost]
[Route("user/put")]
public IHttpActionResult PutUser(int id, User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != user.Id)
{
return BadRequest();
}
db.Entry(user).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/Users
[HttpPost]
[Route("user/post")]
public IHttpActionResult PostUser(User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Users.Add(user);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = user.Id }, user);
}
[HttpPost]
[Route("user/delete")]
public IHttpActionResult DeleteUser(int id)
{
User user = db.Users.Find(id);
if (user == null)
{
return NotFound();
}
db.Users.Remove(user);
db.SaveChanges();
return Ok(user);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool UserExists(int id)
{
return db.Users.Count(e => e.Id == id) > 0;
}
}