所以,我被困在一个奇怪的行为,也就是说,我可以使用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="data source=WIN-WWU3DMLR6PX\PIXIELIT;initial catalog=MastarsFriendsMVCDatabase;persist security info=True;user id=sa;password=sa_12345;MultipleActiveResultSets=True;App=EntityFramework"" 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