2017-01-17 5 views
2

Я не могу использовать провайдера типов на локальном хосте для Android-эмулятора.Я не могу использовать провайдера типов на локальном хосте для Android-эмулятора

Это не работает для меня при использовании поставщика типа F #, потому что TypeProvider устанавливает соединение во время разработки.

Тип Provider счастлив, когда я использую локальный

[<Literal>] 
let JsonPath = "http://localhost:48213/api/cars" 
type Repository = JsonProvider<JsonPath> 

Однако я получаю соединение отказался при попытке использовать путь LOCALHOST. Подробности об этой ошибке можно найти here.

В результате, я считаю, что разрешение использовать альтернативный IP-адрес:

10.0.2.2

Тип поставщика не счастлив, когда я использую 10.0.2.2

Замена " localhost " с " 10.0.2.2 " по IP-адресу приводит к ошибке компиляции, связанной с TypeProvider, не устанавливающей соединение с обновленным IP-адресом.

Следующий код не будет компилироваться, когда я пытаюсь использовать «10.0.2.2» в качестве альтернативного IP (AKA: обходной), который является искомым IP для работы эмулятора:

[<Literal>]  (* "10.0.2.2" is the workaround IP for local host *) 
let JsonPath = "http://10.0.2.2:48213/api/cars" 
type Repository = JsonProvider<JsonPath> 

type Car = { Make:string ; Model:string } 

let getCars() = 

    Repository.Load JsonPath 
    |> Array.toSeq 
    |> Seq.map(fun x -> { Make=x.Make ; Model=x.Model }) 

В заключение, как я могу получить доступ к файлу с помощью службы WebAPI, выполняемой на локальном компьютере, и до сих пор поддерживаю поддержку поставщика типов при выполнении провайдера типов на эмуляторе?

ответ

5

Статический параметр, который вы указываете при создании JsonProvider, предназначен только для времени разработки, чтобы он генерировал вам типы. Когда вы вызываете Repositor.Load, это будет uri, который вы используете для выполнения. Их следует рассматривать отдельно, например:

[<Literal>] 
let DevelopmentJsonPath = "http://localhost:48213/api/cars" 

type Repository = JsonProvider<DevelopmentJsonPath> 

type Car = { Make:string ; Model:string } 

let runtimeUri = "http://production.mycompany.com/api/cars" 
let getCars() = 

    Repository.Load runtimeUri 
    |> Array.toSeq 
    |> Seq.map(fun x -> { Make=x.Make ; Model=x.Model }) 
+0

Thanks Stuart. Однако компилятор жалуется на время разработки при подключении «10.0.2.2». Следовательно, я думаю, что IP еще не существует до запуска эмулятора. –

+0

У меня было это backward =) Итак, если вы используете localhost, чтобы заставить провайдера типа работать и компилироваться. Затем установите 'runtimeUri' то, что вы хотите во время выполнения. – Stuart

+0

Спасибо. Я столкнулся с другой проблемой, в которой мой экран полностью черный, без данных. Но это отдельная проблема. –