【问题标题】:ASP.NET Web API - 405 (Method Not Allowed)ASP.NET Web API - 405(不允许的方法)
【发布时间】:2018-05-27 03:32:50
【问题描述】:

当我使用邮递员测试我的 API 时,它运行良好。但是当我从客户端应用程序调用 API 时,它会给出 405 - Method Not Allowed 错误。如果我删除 [Authorize] 从控制器它也适用于客户端应用程序。我已经尝试了堆栈溢出以及其他站点中的几乎所有内容,但仍然找不到正确的解决方案。

story - 我想只使用 Jquery 和 html 创建一个单独的客户端应用程序。它应该使用使用 .NET Web API 创建的 API。 API 由 OWIN 保护。

来自客户的电话 -

$.ajaxSetup({
        headers: {
            'Authorization': authHeaders
        }
    });

    this.$.get('http://localhost:62461/api/member/GetMember', function (response, status, jqxhr) {
        alert('ok');
    });

API web.config -

    <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
      </customHeaders>
    </httpProtocol>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="FormsAuthentication" />

      <remove name="WebDAVModule"/>
      <remove name="UrlRoutingModule"/>
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>

    <handlers accessPolicy="Read, Script">
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />          
      <remove name="WebDAV" />

      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web,Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

API Startup.cs -

public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    PublicClientId = "self";

    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        TokenEndpointPath = new PathString("/Token"),
        Provider = new ApplicationOAuthProvider(PublicClientId),
        AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
        // In production mode set AllowInsecureHttp = false
        AllowInsecureHttp = true
    };
    app.UseOAuthAuthorizationServer(OAuthOptions); 
}

方法——

[RoutePrefix("api/Member")]
[Authorize]
public class MemberController : ApiController
{
    [Route("GetMember")]
    [HttpGet]        
    public string GetMember()
    {            
        return "Member 1";
    }
}

【问题讨论】:

  • 在您的 web.config 中,您的 ExtensionlessUrl-Integrated-4.0 配置不允许使用 OPTIONS 动词。如果您添加它,或者只是将其更改为 verb="*" 会有所不同吗?
  • 尝试添加具有 [HttpOptions] 属性和相同路由到控制器的方法,如果有帮助,那么您在处理来自客户端的 Oprions 请求时遇到问题
  • 仍有错误。我忘了告诉你。如果我从控制器中删除 [Authorize],它将起作用。

标签: jquery asp.net ajax asp.net-web-api


【解决方案1】:

我也有同样的例外。我的问题是我使用了错误的命名空间:

using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!!
    [HttpGet]
    public string Blah()
    {
        return "blah";
    }

那应该是:

 using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}

这解决了我的异常。 看看对你有没有帮助..

【讨论】:

    【解决方案2】:

    我认为飞行前请求将是您的问题。默认情况下,浏览器不允许访问第三方域。 在您的 jquery 中使用 JSONP 或在您的 API 中启用 CORS。 在您的 HTTP 配置部分使用,

    config.EnableCors();
    

    否则用

    装饰你的控制器
    [EnableCors(origins: "http://api name.com", headers: "*", methods: "*")]
    

    要使用这些方法,您需要从 nuget 安装包,

    Microsoft.AspNet.WebApi.Cors
    

    请确认 [Authorize] 属性。 从您的评论来看,这是罪魁祸首。您需要确保的一件事是此函数的返回响应应包括 api 框架生成的所有标头,例如与“Access-Control-Allow-Origin”相关的标头。此标头应出现在此处以选择浏览器在预检后启动原始请求。因此,您的预检请求响应不包含允许来源相关信息。请确保是否显示。您可以使用提琴手或任何代理客户端。所以实际上从浏览器中您可以看到 2 个请求,一个用于预检,一个用于原始请求。我认为您的预检请求响应标头不包含相关信息。

    【讨论】:

    • 对不起,我忘了告诉你,如果我从控制器中删除 [Authorize],它会起作用。无论如何,我添加了这个并且错误仍然存​​在
    • 我已经更新了我的答案。请考虑最后一部分并尝试
    猜你喜欢
    • 2018-02-04
    • 2013-03-21
    • 1970-01-01
    • 2013-12-25
    • 2021-09-30
    • 2016-03-23
    • 1970-01-01
    • 2012-09-30
    • 2014-06-03
    相关资源
    最近更新 更多