C# · 12月 30, 2021

c# – MVC-Web API:405方法不允许

所以,我被困在一个奇怪的行为,也就是说,我可以使用Postman(chrome的插件)或使用RESTClient(Firefox的扩展)发送(或POST)数据,

但是无法将其从我的位于项目之外的html文件发送出去.当我在chrome中打开html时显示以下错误:

OPTIONS http://localhost:1176/api/user/ 405 (Method Not Allowed)XMLHttpRequest cannot load http://localhost:1176/api/user/. Invalid HTTP status code 405

我不能弄清楚为什么会发生这种情况.以下是详细信息,您可能需要帮助我解决我的错误:

UserController.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;using WebAPIv2.Models;namespace WebAPIv2.Controllers{ public class UserController : ApiController { static IUserRepository userRepository = new UserRepository(); [HttpGet] public List<TableUser> GetAllUsers() { return userRepository.GetAll(); } [HttpGet] public HttpResponseMessage GetUser(int id) { TableUser user = userRepository.Get(id); if (user == null) { return Request.CreateErrorResponse(HttpStatusCode.NotFound,”User Not found for the Given ID”); } else { return Request.CreateResponse(HttpStatusCode.OK,user); } } [HttpPost] public HttpResponseMessage PostUser(TableUser user) { user = userRepository.Add(user); var response = Request.CreateResponse<TableUser>(HttpStatusCode.Created,user); string uri = Url.Link(“DefaultApi”,new { id = user.UserId }); response.Headers.Location = new Uri(uri); return response; } [HttpPut] public HttpResponseMessage PutUser(int id,TableUser user) { user.UserId = id; if (!userRepository.Update(user)) { return Request.CreateErrorResponse(HttpStatusCode.NotFound,”Unable to Update the User for the Given ID”); } else { return Request.CreateResponse(HttpStatusCode.OK); } } [HttpDelete] public HttpResponseMessage DeleteProduct(int id) { userRepository.Remove(id); return new HttpResponseMessage(HttpStatusCode.NoContent); } }}

User.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace WebAPIv2.Models{ public class User { public int UserId { get; set; } public string UserName { get; set; } public string Password { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } }}

IUserRepository.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace WebAPIv2.Models{ interface IUserRepository { List<TableUser> GetAll(); TableUser Get(int id); TableUser Add(TableUser user); void Remove(int id); bool Update(TableUser user); }}

UserRepository.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace WebAPIv2.Models{ public class UserRepository : IUserRepository { MastarsFriendsMVCDatabaseEntities userEntities; public UserRepository() { userEntities = new MastarsFriendsMVCDatabaseEntities(); } public List<TableUser> GetAll() { //throw new NotImplementedException(); return userEntities.TableUsers.ToList(); } public TableUser Get(int id) { //throw new NotImplementedException(); var users = userEntities.TableUsers.Where(x => x.UserId == id); if (users.Count() > 0) { return users.Single(); } else { return null; } } public TableUser Add(TableUser user) { //throw new NotImplementedException(); if (user == null) { throw new ArgumentNullException(“item”); } userEntities.TableUsers.Add(user); userEntities.SaveChanges(); return user; } public void Remove(int id) { //throw new NotImplementedException(); TableUser user = Get(id); if (user != null) { userEntities.TableUsers.Remove(user); userEntities.SaveChanges(); } } public bool Update(TableUser user) { //throw new NotImplementedException(); if (user == null) { throw new ArgumentNullException(“student”); } TableUser userInDB = Get(user.UserId); if (userInDB == null) { return false; } userEntities.TableUsers.Remove(userInDB); userEntities.SaveChanges(); userEntities.TableUsers.Add(user); userEntities.SaveChanges(); return true; } }}

WebApiConfig.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Net.Http.Headers;using System.Web.Http;namespace WebAPIv2{ public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); //config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(“text/html”)); config.Routes.MapHttpRoute( name: “DefaultApi”,routeTemplate: “api/{controller}/{id}”,defaults: new { id = RouteParameter.Optional } ); } }}

index.html的:

<!DOCTYPE html><html> <head> <title>TODO supply a title</title> <Meta charset=”UTF-8″> <Meta name=”viewport” content=”width=device-width,initial-scale=1.0″> <!–<script src=”http://code.jquery.com/jquery-1.9.1.min.js”></script>–> <script src=”http://code.jquery.com/jquery-2.1.0.min.js”></script> </head> <body> <script> $(document).ready(function() {// jQuery.support.cors = true;// $.ajax({// url: “http://localhost:1176/api/user/1”,// headers: {“Accept”: “application/json”},// type: “GET”,// success: function(data) {// alert(JSON.stringify(data));// },// error: function() {// alert(“Error”);// }// });// }); var user = { UserName: “Disha”,Password: “disha123”,FirstName: “Disha”,LastName: “Vora”,Email: “disha@pixielit.com” }; $.ajax({ url: ‘http://localhost:1176/api/user/’,type: ‘POST’,data: JSON.stringify(user),crossDomain: true,headers: {“Accept”:”application/json”,”Content-Type”:”application/json”},success: function(data) { alert(‘User added Successfully’); },error: function() { alert(‘User not Added’); } }); }); </script> </body></html>

Web.config文件:

<?xml version=”1.0″ encoding=”utf-8″?><!– For more information on how to configure your ASP.NET application,please visit http://go.microsoft.com/fwlink/?LinkId=301879 –><configuration> <configSections> <!– For more information on Entity Framework configuration,visit http://go.microsoft.com/fwlink/?LinkID=237468 –> <section name=”entityFramework” type=”System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,EntityFramework,Version=5.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089″ requirePermission=”false” /> </configSections> <appSettings></appSettings> <system.web> <compilation debug=”true” targetFramework=”4.5″> <assemblies> <add assembly=”System.Data.Entity,Version=4.0.0.0,PublicKeyToken=b77a5c561934e089″ /> </assemblies> </compilation> <httpRuntime targetFramework=”4.5″ /> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration=”false” /> <modules runAllManagedModulesForAllRequests=”true”> <remove name=”WebDAVModule” /> </modules> <httpProtocol> <customHeaders> <add name=”Access-Control-Allow-Origin” value=”*” /> <add name=”Access-Control-Request-Headers:” value=”*” /> <add name=”Access-Control-Request-Method:” value=”*” /> <add name=”Access-Control-Allow-Methods” value=”*” /> <!–<add name=”Allow” value=”*”/>–> </customHeaders> </httpProtocol> <handlers> <remove name=”WebDAV” /> <remove name=”ExtensionlessUrlHandler-Integrated-4.0″ /> <remove name=”OPTIONSVerbHandler” /> <remove name=”TRACEVerbHandler” /> <add name=”ExtensionlessUrlHandler-Integrated-4.0″ path=”*.” verb=”*” type=”System.Web.Handlers.TransferRequestHandler” preCondition=”integratedMode,runtimeVersionv4.0″ /> </handlers> <directoryBrowse enabled=”true” /> </system.webServer> <entityFramework> <defaultConnectionFactory type=”System.Data.Entity.Infrastructure.LocalDbConnectionFactory,EntityFramework”> <parameters> <parameter value=”v11.0″ /> </parameters> </defaultConnectionFactory> </entityFramework> <connectionStrings> <add name=”MastarsFriendsMVCDatabaseEntities” connectionString=”Metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.sqlClient;provider connection string=&quot;data source=WIN-WWU3DMLR6PX\PIXIELIT;initial catalog=MastarsFriendsMVCDatabase;persist security info=True;user id=sa;password=sa_12345;MultipleActiveResultSets=True;App=EntityFramework&quot;” providerName=”System.Data.EntityClient” /> </connectionStrings></configuration>解决方法 WebApi可能会阻止CORS请求.要在WebApi上启用CORS,请使用Microsoft.AspNet.WebApi.Cors包.有关详细信息,请查看 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api