ASP.NET Web API - 405(不允许的方法)

时间:2017-12-13 09:36:01

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

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

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

来自客户的电话 -

$.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";
    }
}

2 个答案:

答案 0 :(得分:2)

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

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";
}

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

答案 1 :(得分:0)

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

config.EnableCors();

否则用

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

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

Microsoft.AspNet.WebApi.Cors

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