你好我已经用C#中的WebAPI 2制作了一个API,我已经在api中启用了CORS并进行了令牌认证,例如,我几乎可以做任何请求。
我有一个控制器用于测试并且有这个
root@davide:/var/www/html/wordpress# ls -l
total 168
-rwxrwxrwx 1 vagrant vagrant 418 Sep 25 2013 index.php
-rwxrwxrwx 1 vagrant vagrant 19935 Jan 2 18:51 license.txt
-rwxrwxrwx 1 vagrant vagrant 7433 Jan 11 17:46 readme.html
-rwxrwxrwx 1 vagrant vagrant 5447 Sep 27 21:36 wp-activate.php
drwxr-xr-x 1 vagrant vagrant 3060 Feb 21 20:09 wp-admin
-rwxrwxrwx 1 vagrant vagrant 364 Dec 19 2015 wp-blog-header.php
-rwxrwxrwx 1 vagrant vagrant 1627 Aug 29 12:00 wp-comments-post.php
-rwxrwxrwx 1 vagrant vagrant 2832 Feb 21 20:09 wp-config.php
drwxr-xr-x 1 vagrant vagrant 238 Feb 21 20:12 wp-content
-rwxrwxrwx 1 vagrant vagrant 3286 May 24 2015 wp-cron.php
drwxr-xr-x 1 vagrant vagrant 6392 Feb 21 20:09 wp-includes
-rwxrwxrwx 1 vagrant vagrant 2422 Nov 21 02:46 wp-links-opml.php
-rwxrwxrwx 1 vagrant vagrant 3301 Oct 25 03:15 wp-load.php
-rwxrwxrwx 1 vagrant vagrant 33939 Nov 21 02:46 wp-login.php
-rwxrwxrwx 1 vagrant vagrant 8048 Jan 11 05:15 wp-mail.php
-rwxrwxrwx 1 vagrant vagrant 16250 Nov 29 05:39 wp-settings.php
-rwxrwxrwx 1 vagrant vagrant 29896 Oct 19 04:47 wp-signup.php
-rwxrwxrwx 1 vagrant vagrant 4513 Oct 14 19:39 wp-trackback.php
-rwxrwxrwx 1 vagrant vagrant 3065 Aug 31 16:31 xmlrpc.php
如果我向任何客户提出请求,如Fiddler或Advance Rest Client,使用方法GET到api / Prueba,没有令牌工作完美,而api / Prueba / 5发送持票令牌,它也会返回完美,但是当我打电话时从客户端角度来看,总是发送方法OPTIONS并拒绝承诺,我尝试从chrome和firefox尝试使用$ http,Restangular和JQuery REST Client,但总是有相同的结果。
谢谢大家。
更新
以下是Chrome中的控制台显示的内容,在Firefox中没有显示任何内容:
无法加载http://localhost:49950/api/prueba/。请求标头字段预检响应中的Access-Control-Allow-Headers不允许授权。
更新
我已经以这种方式在WebApiConfig.cs中启用了CORS:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace ApiJSON.Controllers
{
public class PruebaController : ApiController
{
// GET: api/Prueba
[AllowAnonymous]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/Prueba/5
[Authorize]
public string Get(int id)
{
return "value";
}
// POST: api/Prueba
public void Post([FromBody]string value)
{
}
// PUT: api/Prueba/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE: api/Prueba/5
public void Delete(int id)
{
}
}
}
按照建议,我以这种方式在控制器中添加了EnableCors:
public static void Register(HttpConfiguration config)
{
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
我正在Startup.cs中看到我所拥有的东西,我以这种方式使用Microsoft.Owin.Cors:
// GET: api/Prueba/5
[Authorize]
[EnableCors(origins:"*", headers:"*", methods:"*")]
public string Get(int id)
{
return "value";
}
也许是在干扰System.Web.Http.Cors再次感谢您的帮助。
更新
我已经发现问题了,在Global.asax我需要指定标题,这就是我把它放在工作正常的方式。
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
var myProvider = new MyAuthorizationServerProvider();
OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = myProvider
};
app.UseOAuthAuthorizationServer(options);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
//ConfigureAuth(app);
//app.MapSignalR();
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration { };
map.RunSignalR(hubConfiguration);
});
}
这是我添加的代码:
HttpContext.Current.Response.AddHeader(&#34; Access-Control-Allow-Headers&#34;,&#34;授权&#34;);
感谢您的回答,我希望它可以帮助其他人。
答案 0 :(得分:0)
假设您使用的是Microsoft.AspNet.WebApi.Cors包。
您需要在控制器(或操作)上使用EnableCors
属性或在config类中全局启用CORS。上面的代码中似乎缺少该属性。