F# WebApi Cors 不起作用

标签 f# cors asp.net-web-api2 unauthorized

我正在尝试创建一个用 F# 编写的 WebApi 项目并启用 CORS .
Controller :

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# 中的等效 Controller 工作:
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
}

最佳答案

所以我做了我的有点不同,但我相信同样的概念适用。我的也是在 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 应用程序的授权域。代码有点不同,但如果它对任何人有帮助,我可以发布它。

关于F# WebApi Cors 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490122/

相关文章:

java - ReactJS 和 Java : Response to preflight request doesn't pass access control check

c# - token 授权 web api 2 不返回用户名

c# - 应该多广泛地使用异步/等待模式?

f# - 为什么 bindingRedirect 不影响 FSharp.Core 版本

f# - 如何评估此 F# 工作流程?

f# - 使用匿名记录给出语法错误 : FS0010: Unexpected symbol '|' in expression

cors - 我是否应该在 OPTIONS 请求之后的实际请求中将任何 Access-Control-Allow-Origin header 发送到不允许的来源?

f# - f# 有没有办法对列表执行交叉操作?

ruby-on-rails - CORS 开发政策阻止的所有请求

asp.net-web-api - 在 F# 中实现 IExceptionHandler 或 IExceptionLogger 等消息处理程序时,返回 "empty task"的正确方法是什么?