C# Web API 2 PUT 和 POST 请求"not supported"



到目前为止,我有我的ASP。. NET web api正确地为员工执行get请求并使用JQuery填充字段。删除请求也有效,但我一直收到:

Message=The requested resource does not support http method 'PUT'.

的405 HTTP方法不允许错误。这可能是因为我的put/post请求包括对象和字符串作为参数,而不是简单地获取url的id来GET和DELETE。这是从一个网站到另一个跨源请求,所以我有enableCors()在我的网络。配置文件以及删除WEBDAV:

<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule" />
  <remove name="FormsAuthentication" />
</modules>
<httpProtocol>
  <customHeaders>
    <clear />
    <add name="Access-Control-Allow-Origin" value="https://chad-dev.clas.uconn.edu" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="WebDAV" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers></system.webServer>

这是我的WebApiConfig注册函数:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {  id = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            "WithAction",
            "api/{controller}/{action}/{id}",
            new { controller = "Commitments", action = "GetCommitment" }
        );

我的控制器:

[HttpPut]
    public IHttpActionResult PutEmployee([FromBody]EmployeeModel employeeModel, string netId)
    {     
        var chadResult = new CLASWebApiResponse
        {
            Success = true,
            ResponseMessage = "Success",
            Data = null
        };
        try
        {
            employee employeeUpdate = masterDb.employees.Find(employeeModel.Id);
            if (employeeUpdate == null)
            {
                chadResult.ResponseMessage = "Employee not found";
                chadResult.Success = false;
                return Ok(chadResult);
            }
            employeeUpdate.netid = employeeModel.NetId;
            employeeUpdate.enumber = employeeModel.Enumber;
            employeeUpdate.peoplesoft = employeeModel.Peoplesoft;
            employeeUpdate.email = employeeModel.Email;
            employeeUpdate.tenure_year = employeeModel.TenureYear;
            employeeUpdate.tenure_indicator = employeeModel.TenureIndicator;
            employeeUpdate.hire_date = employeeModel.HireDate;
            employeeUpdate.gender = employeeModel.Gender;
            employeeUpdate.birth_date = employeeModel.BirthDate;
            employeeUpdate.updated_by = netId;
            masterDb.SaveChanges();
            chadResult.Success = true;
            chadResult.ResponseMessage = "Success";
            return Ok(chadResult);
        }
        catch (Exception e)
        {
            chadResult.ResponseMessage = e.Message;
            chadResult.Success = false;
            return Ok(chadResult);
        }
    }

最后(抱歉代码量),我的ajax请求:

$.ajax({
            type: "PUT",
            url: "https://chad-test4.clas.uconn.edu/api/Employees/PutEmployee",
            dataType: "json",
            contentType: "application/json",
            data: JSON.stringify({employeeModel:employeeData, netId:'22'}),
            traditional: true,
            success: function() {
                console.log(employeeModel);
                alert("Saved Successfully.");
            },
            error: function(response) {
                console.log(employeeModel);
                alert("Employee data failed to save to server. Error message: " + jQuery.parseJSON(response.responseText).Message);
            }
        });

根据本文,Web api将尝试从URL获取字符串值,而您正在请求正文中提供它。

尝试将ajax调用更改为:

$.ajax({
        type: "PUT",
        url: "https://chad-test4.clas.uconn.edu/api/Employees/PutEmployee?netId=22",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({employeeModel:employeeData}),
        traditional: true,
        success: function() {
            console.log(employeeModel);
            alert("Saved Successfully.");
        },
        error: function(response) {
            console.log(employeeModel);
            alert("Employee data failed to save to server. Error message: " + jQuery.parseJSON(response.responseText).Message);
        }
    });

您不需要用[FromBody]注释EmployeeModel,因为它是一个复杂的对象。默认情况下,Web Api默认序列化将尝试从正文中获取它。

注意:如果netID是更新资源的用户的ID,最好在EmployeeModel中有一个UpdatedBy属性。遵循REST原则,PUT请求应该在URL

中具有资源的ID

最新更新