当我用邮递员测试我的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";
}
}
答案 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个用于原始请求。我认为您的预检请求响应标头不包含相关信息。