【发布时间】: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