HTTP PUT 在 ASP.NET Web API 中不起作用

HTTP PUT is not working in ASP.NET Web API

我有一个简单的 Web API 控制器,其中 GETPOST 正在工作,但 PUTDELETE 不工作。服务器在访问 PUT 和 DELETE 时抛出 The requested resource does not support http method 'PUT' 错误 这是 web.config 的样子:

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </configSections>
        <system.web>
            <compilation debug="true" targetFramework="4.5.2">
                <assemblies>
                    <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
                </assemblies>
            </compilation>
            <httpRuntime targetFramework="4.5.2" />
            <httpModules>
                <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
            </httpModules>
        </system.web>
        <system.webServer>
            <validation validateIntegratedModeConfiguration="false" />
            <modules>
                <remove name="ApplicationInsightsWebTracking" />
                <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
            </modules>
            <handlers>
                <remove name="ExtensionlessUrlHandler-Integrated-4.0" />      
                <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
            </handlers>
        </system.webServer>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
                </dependentAssembly>
                <dependentAssembly>
                    <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
        <system.codedom>
            <compilers>
                <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
                <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
            </compilers>
        </system.codedom>    
    </configuration>

Global.asax

的代码
protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Web 代码API 配置

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{Id}",
            defaults: new { Id = RouteParameter.Optional }
    );
}

控制器有...

public class GroupsController : ApiController
{
    [System.Web.Http.HttpPut]
    public ActionResult Put(int Id, [FromBody]Group NewGroup)
    {
        //some code here
    }
}

我也查看了在线资源,但其中 none 正在帮助... here and here

我正试图让这个 API 在开发机器(IIS express/compact 一个 Visual Studio 附带的机器)上工作。

您似乎没有将 id 作为 url 部分传递。例如"put /api/Groups"会return这个错误,但是"put /api/Groups/1"一定能正常工作。

你查看过默认路由吗

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

routeTemplate: "api/{controller}/{action}/{id}",

您的配置中缺少 {action}。

和API,供参考:

[HttpPut]
public IHttpActionResult Hero(int Id)

下面API调用有效

http://localhost:48613/api/SuperHumans/Hero/1

下面的 API 调用将不起作用,因为 API 路由不匹配

http://localhost:48613/api/SuperHumans/Hero

还要确保您从客户端传递的内容类型正确

编辑-2

REST API

[System.Web.Http.HttpPut]
public void Put(int id, Dummy value)
{

}

Property Class

public class Dummy
{
    public string key1 { get; set; }
    public string key2 { get; set; }
}

POSTMAN REST CALL

调试器