[英]ASP.Net Controller method not allowed
我正在從asp.net學習web.api。 問題是,我的刪除和放置方法現在無法正常工作。 我認為我的代碼有問題:*
這是我要刪除的控制器:
[ResponseType(typeof(Location))]
public IHttpActionResult DeleteLocation(Guid id)
{
Location location = _locationRepository.GetSingle(e => e.Id == id);
if (location == null)
{
return NotFound();
}
_locationRepository.Delete(location);
return Ok(location);
}
這些是我的建議:
[HttpPost]
[ResponseType(typeof(LocationViewModel))]
public async Task<IHttpActionResult> PutLocation(Guid id, LocationViewModel location)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != location.Id)
{
return BadRequest();
}
location.Id = id;
try
{
await _locationRepository.EditAsync(location.ToModel());
}
catch (DbUpdateConcurrencyException)
{
if (!LocationExist(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
405方法不允許..我不知道。 這些是我的通用存儲庫。 也許這也有問題。
public abstract class GenericRepository<C, T> :IGenericRepository<T> where T : class,ISoftDelete where C : DbContext, new()
//public abstract class GenericRepository<T> : IGenericRepository<T> where T : class, ISoftDelete
{
//protected readonly ShopDiaryProject.EF.ShopDiaryDbContext _entities;
private C _entities = new C();
public C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>().Where(i => i.IsDeleted == false);
return query;
}
public virtual IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = _entities.Set<T>().Where(i => i.IsDeleted == false).Where(predicate);
return query;
}
public virtual T GetSingle(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
T data = _entities.Set<T>().Where(i => i.IsDeleted == false).FirstOrDefault(predicate);
return data;
}
public virtual bool Add(T entity)
{
try
{
_entities.Set<T>().Add(entity);
this.Save();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public virtual bool AddRange(IEnumerable<T> entity)
{
try
{
_entities.Set<T>().AddRange(entity);
this.Save();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public virtual bool Delete(T entity)
{
try
{
entity.IsDeleted = true;
entity.DeletedDate = DateTime.Now;
Edit(entity);
this.Save();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public virtual bool Edit(T entity)
{
try
{
entity.ModifiedDate = DateTime.Now;
_entities.Entry(entity).State = EntityState.Modified;
this.Save();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public virtual bool Save()
{
try
{
_entities.SaveChanges();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
private bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_entities.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public int Count(Expression<Func<T, bool>> match)
{
return _entities.Set<T>().Count(match);
}
public async virtual Task<bool> AddAsync(T entity)
{
try
{
_entities.Set<T>().Add(entity);
await this.SaveAsync();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public async virtual Task<bool> AddRangeAsync(IEnumerable<T> entity)
{
try
{
_entities.Set<T>().AddRange(entity);
await this.SaveAsync();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public async virtual Task<bool> DeleteAsync(T entity)
{
try
{
entity.IsDeleted = true;
entity.DeletedDate = DateTime.Now;
Edit(entity);
await this.SaveAsync();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
public async virtual Task<bool> EditAsync(T entity)
{
try
{
entity.ModifiedDate = DateTime.Now;
_entities.Entry(entity).State = EntityState.Modified;
await this.SaveAsync();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
//catch (Exception e)
//{
// return false;
//}
}
public async virtual Task<bool> SaveAsync()
{
try
{
await _entities.SaveChangesAsync();
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
}
}
return false;
}
}
也許有人可以幫助我:)預先感謝
您可以在您的delete方法上添加[HttpDelete]
,以便將其標識為delete動作動詞
[HttpDelete]
[ResponseType(typeof(Location))]
public IHttpActionResult DeleteLocation(Guid id)
{
基於MSDN :
Web API還基於請求的HTTP方法(GET,POST等)選擇操作。 默認情況下,Web API使用控制器方法名稱的開頭查找不區分大小寫的匹配項。 例如,名為PutCustomers的控制器方法與HTTP PUT請求匹配。
您可以通過使用以下任何屬性裝飾方法來覆蓋此約定:
- [HttpDelete]
- [HTTPGET]
- [HttpHead]
- [HttpOptions]
- [HttpPatch]
- [HttpPost]
- [HttpPut]
因此,對於您的Delete
方法:
[HttpDelete]
[Route("{id}")]
[ResponseType(typeof(Location))]
public IHttpActionResult DeleteLocation(Guid id)
{
}
並從Postman設置方法為Delete
並發送到http://localhost:xxxx/api/Locations/xxxx-xxxx-xxxx-xxxx
對於您的Put
方法:
[HttpPut]
[Route("{id}")]
[ResponseType(typeof(LocationViewModel))]
public async Task<IHttpActionResult> PutLocation(Guid id, LocationViewModel location)
{
}
然后從Postman設置方法設置為Put
並將其網址發送到http://localhost:xxxx/api/Locations/xxxx-xxxx-xxxx-xxxx
原因是在認沽動詞刪除不被IIS或IIS快遞默認情況下允許。 因此,您應該將標簽內容替換為web.config文件中的以下內容。
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
//This will enable all Web API verbose
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
希望它能工作。
我在web.config刪除了webdavModule。 而且有效!
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.