加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

F#WebApi Cors不起作用

发布时间:2020-12-16 03:25:03 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试创建一个用F#编写的WebApi项目并启用CORS. 控制者: type DoItController() = inherit ApiController() [EnableCors(origins = "*",headers = "*",methods = "Get")] [HttpGet] [Route "api/GetGenerateExcel"] member __.GetGenerateExcel() = as
我正在尝试创建一个用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
}

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读