我花了几个小时研究这个问题,只是无法弄清楚.
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", "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": "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: "localhost:55249",headers: "*", methods: "*")]不要忘记包含名称空间
using System.Web.Http.Cors;更多推荐
删除动词可在邮递员中使用,但不能与Ajax一起使用
发布评论