针对web api方法的405个奇怪错误

本文关键字:错误 405个 web api 方法 针对 | 更新日期: 2023-09-27 18:05:44

所以我真的很纠结于这个问题,我已经在网上搜索了所有我能找到的建议。

我有一个web api c#项目和一个JS web项目。在本地运行时,一切都很好。当我发布到Azure时,我可以通过REST控制台访问我的api方法,一切都很好。问题是,当我的web应用程序试图击中相同的调用每个方法(除了初始令牌调用)返回405。

我已经通过CORS设置和web进行了劫持。配置了这么多次,我不确定还需要什么……这让人很困惑,但我会尽量把相关的部分粘贴在这里。

我的网页。配置系统。网络服务器设置

<modules>
  <remove name="FormsAuthentication" />
  <remove name="WebDAVModule"/>
</modules>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>
<handlers>
    <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>

WebApiConfig.cs注册方法

        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

和一个api控制器的例子

    [Authorize]
    [Route("getall")]
    [HttpGet]
    public IHttpActionResult GetAll()
    {
        return Ok(PersonRepository.Get());
    }

和JS $http.get($rootScope.serviceBase + 'api/person/getall')

那么总结一下这里的情况:

  • 本地运行时,呼叫工作正常
  • 当发布到Azure时,我可以直接调用其他端点
  • 当发布到Azure时,我的JS返回405个非描述性错误
  • 如果我从web中删除CORS头。配置和使用enableCors在我的注册方法我甚至不能打/令牌,相反,我得到CORS预飞行错误无处不在(虽然我仍然可以成功地从休息控制台呼叫),这是非常混乱

我会把我在这里尝试的东西记录下来:

    在webConfig中添加<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />到customHeaders,没有变化

针对web api方法的405个奇怪错误

修复!多亏了各种stackoverflow帖子的编译(我喜欢这个网站),我重建了我的web.config

如果它对其他人有用,这是我新的web.config

<system.web>

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<customErrors mode="Off" />
</system.web>  
<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type,Authorization" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>