删除动词可在邮递员中使用,但不能与Ajax一起使用 [英] DELETE verb working in Postman but not with ajax
问题描述
我花了几个小时研究这个问题,只是无法弄清楚.
I have spent several hours researching this and just cannot figure it out.
首先我告诉你我拥有的东西
first I' show you what i have
js:
function deleteContact(id) {
let url = baseUrl + "Contact/" + id;
var data = {
id : id
}
$.support.cors = true;
$.ajax({
url: url,
type: 'DELETE',
dataType: 'json',
data:data
});
}
我有一个联系人控制器:
I have a Contact Controller:
public class ContactController : SimpleController<Contact>
{
public ContactController (IRepository<Contact> repository) : base(repository)
{
}
}
和SimpleController:
and the SimpleController:
public abstract class SimpleController<T> : BaseController
where T : class, IEntity, new()
{
private readonly IRepository<T> _repository;
protected SimpleController (IRepository<T> repository)
{
_repository = repository;
}
[HttpGet]
public virtual IEnumerable<T> Get ()
{
var list = _repository.FindAll().ToList();
return list;
}
[HttpGet]
public virtual T Get (Guid id)
{
var entity = _repository.Find(id);
if ( entity == null )
throw new HttpResponseException(HttpStatusCode.NotFound);
return entity;
}
[HttpPost]
public virtual HttpResponseMessage Post (T entity)
{
if ( entity.Id != Guid.Empty )
throw new HttpResponseException(HttpStatusCode.BadRequest);
_repository.Add(entity);
_repository.Save();
var response = Request.CreateResponse<T>(HttpStatusCode.Created, entity);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = entity.Id }));
return response;
}
[HttpPatch]
public virtual T Patch (T entity)
{
var matchingItem = _repository.Find(entity.Id);
if ( matchingItem == null )
throw new HttpResponseException(HttpStatusCode.NotFound);
_repository.Update(entity);
_repository.Save();
return entity;
}
[HttpDelete]
public virtual void Delete (Guid id)
{
var matchingItem = _repository.Find(id);
if ( matchingItem == null )
throw new HttpResponseException(HttpStatusCode.NotFound);
_repository.Delete(id);
_repository.Save();
}
}
我会说我不是邮递员,这可以删除项目,但不会使用ajax.
I will say that i'n postman this works it deletes the item but it doesnt using the ajax.
我尝试了很多事情,但仍然保持405看起来像这样的回复
I have tried many things but still keep getting a 405 with a response that looks like this
{
"name": "Microsoft.ApplicationInsights.Dev.Request",
"time": "2016-11-13T12:41:02.0356067Z",
"tags": {
"ai.device.roleInstance": "James-Desktop.JAILAFILES.com",
"ai.operation.name": "OPTIONS Contact [id]",
"ai.operation.id": "9UbG1l7oEJA=",
"ai.internal.sdkVersion": "web: 2.1.0.363"
},
"data": {
"baseType": "RequestData",
"baseData": {
"ver": 2,
"id": "9UbG1l7oEJA=",
"name": "OPTIONS Contact [id]",
"startTime": "2016-11-13T07:41:02.0356067-05:00",
"duration": "00:00:02.4510180",
"success": false,
"responseCode": "405",
"url": "http://localhost:52136/api/Contact/96d53daa-deca-4dbd-8c6d-2a236387d258",
"httpMethod": "OPTIONS",
"properties": {
"DeveloperMode": "true"
}
}
}
}
我还应该补充一点,它永远不会到达称为Delete的方法,但确实会碰到简单的控制器构造函数.
I should also add that it never reaches the method called Delete but it does hit the simple controller constructor.
更新:
public Repository()
{
_context = new AlltechContext();
}
public virtual T Add(T entity)
{
if (entity.Id == Guid.Empty)
entity.Id = Guid.NewGuid();
return _context.Set<T>().Add(entity);
}
public virtual void Delete(Guid id)
{
var entity = _context.Set<T>().FirstOrDefault(x => x.Id == id);
_context.Set<T>().Remove(entity);
}
public virtual T Find(Guid id)
{
return _context.Set<T>().FirstOrDefault(x => x.Id == id);
}
public int Save()
{
try
{
return _context.SaveChanges();
}
catch (DbEntityValidationException ex)
{
var message = ex.EntityValidationErrors.Select(x=>x.ValidationErrors);
throw new ArgumentException(message.ToString());
}
}
public virtual IEnumerable<T> FindAll ()
{
return _context.Set<T>();
}
public virtual T Update (T entity)
{
var actualEntity = _context.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
DuplicateItem(actualEntity, entity);
_context.Set<T>().Attach(actualEntity);
_context.Entry(actualEntity).State = EntityState.Modified;
return entity;
}
推荐答案
在App_Start下的Webconfig.cs中检查这些行是否存在
check if these lines are there in your Webconfig.cs under App_Start
using System.Web.Http;
namespace WebService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// New code
config.EnableCors();////////////////////////////
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
如果该行不可用,请转到软件包管理器控制台使用此命令
If that line is not available goto package manager console use this command
Install-Package Microsoft.AspNet.WebApi.Cors
然后您可能会对此行进行注释,如果需要取消注释的话.
And then you might have that line might be commmented, if so un comment it.
将此行添加到您的控制器类
add this line to your controller class
[EnableCors(origins: "http://localhost:55249",headers: "*", methods: "*")]
不要忘记包含名称空间
using System.Web.Http.Cors;
这篇关于删除动词可在邮递员中使用,但不能与Ajax一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!