F # WebApi Cors не работает - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать проект WebApi, написанный на F#, и включить 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
}

1 Ответ

0 голосов
/ 23 мая 2018

Так что я сделал немного по-другому, но я верю, что применима та же концепция.Мой тоже в 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.Коды немного другие, но я могу опубликовать их, если это кому-нибудь поможет.

...