繁体   English   中英

ASP.NET Web API-Ajax PUT-405方法不允许(实体框架)

[英]ASP.NET Web API - Ajax PUT - 405 Method Not Allowed (Entity Framework)

我正在尝试通过JSON通过JQuery的Ajax函数向使用JSON的ASP.NET Web API的用户提供更新。 我不断收到来自服务器的405 (Method not Allowed)响应。 我已经尝试了几乎所有内容,包括在web.config中禁用WebDAV模块,以及向我的web.config中添加Access-Control-Allow-Origin标头。

我使用了数据库优先方法,并使用了ADO模型和DbContext生成。 控制器也是由ASP.NET在创建时生成的。 我认为他们应该工作。

我尝试了PUT和POST都无济于事。 我不知道我在做什么错。

我的JS代码:

function UpdateUserLoginTime(user) {

   $.getScript("src/js/datetimeutils.js");
   var url = "http://foo.bar.com:8081/api/user/".concat(user.ID);

   var current = CurrentDateTime();

   $.ajax({
       url: url,
       type: 'PUT',
       data: JSON.stringify({"LastLoginDate" : current}),
       datatype: "json",
       contentType: "application/json; charset=utf-8",
       crossDomain: true,
       success: function (data) {
           alert('User login time updated sucessfully');
       },
       error: function () {
           alert('Update login time error');
       }
   });
}

对于帖子,我也尝试了JSON.stringify(user)(在URL上没有concat(ID))。

这是我的ASP.NET控制器代码:

 // PUT api/User/5
    public HttpResponseMessage PutUser(string id, User user)
    {
        if (ModelState.IsValid && id == user.ID)
        {
            db.Entry(user).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

    // POST api/User
    public HttpResponseMessage PostUser(User user)
    {
        if (ModelState.IsValid)
        {
            db.Users.Add(user);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.CAC }));
            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

我的配置:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <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>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>

我的RouteConfig:

 public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

您需要为Web API启用CORS,否则在发送请求时,总是会收到405不允许的响应。 看这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM