我正在尝试创建一个用F#
编写的WebApi项目并启用CORS
。
财务主任:
type DoItController() =
inherit ApiController()
[<EnableCors(origins = "*", headers = "*", methods = "Get")>]
[<HttpGet>]
[<Route "api/GetGenerateExcel">]
member __.GetGenerateExcel() =
async {
// Some code
return "It works"
}
|> Async.StartAsTask
}
直接从它运行的浏览器打开它。使用AngularJS
或普通Javascript
拨打电话,我会收到401
。
C#中的等效控制器有效:
public class DoItController : ApiController
{
[EnableCors("*", "*", "Get")]
[HttpGet]
[Route("api/GetGenerateExcel")]
public async Task<string> GetGenerateExcel()
{
//Some code
return "It works"
}
}
我还检查了Global.asax
,它们也匹配:
type Global() =
inherit HttpApplication()
static member RegisterWebApi(config: HttpConfiguration) =
config.EnableCors()
config.MapHttpAttributeRoutes()
config.Formatters.Remove(config.Formatters.XmlFormatter) |> ignore
member x.Application_Start() =
GlobalConfiguration.Configure(Action<_> Global.RegisterWebApi)
public class Global : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(config =>
{
config.EnableCors();
config.MapHttpAttributeRoutes();
config.Formatters.Remove(config.Formatters.XmlFormatter);
});
}
}
我检查了所有的nuget包,他们匹配。此外,web.config没有可能影响功能的差异。
我还可以检查或测试什么?
编辑:
以下是我的Javascript部分,如果添加withcredentials = true
(也在服务器上),它可以工作:
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
// Success!
}
}
request.onerror = function() {
//Error
}
request.send();
AngularJS:
$http.get(url).then(function(response){
// Success!
}, function(error){
// Error
}
答案 0 :(得分:2)
所以我做了一点不同,但我相信同样的概念适用。我也在c#中,所以无视这些差异。
在我的WebApiConfig.cs
中 using System.Web.Http.Cors;
var cors = new EnableCorsAttribute("*", "*", "GET,POST,PUT,OPTIONS");
cors.SupportsCredentials = true;
config.EnableCors(cors);
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
当我使用jQuery或JavaScript访问时,我需要使用我的jQuery请求发送以下内容。这是授权用户访问的内容。
xhrFields : {withCredentials: true}
我没有像你那样使用Global.asax中的任何代码,因为我注册了所有指向App_Start文件夹中相关类的配置内容。
我的globabl.asax看起来像这样
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
只是一个注释,我个人使用了一个xml文件的方法,我存储了可以访问webapi应用程序的授权域。代码有点不同,但我可以发布它,如果它可以帮助任何人。