Я пытаюсь моделировать вызов RPC к веб-серверу JBOSS от Silverlight (4). Я написал код, и он работает в консольном приложении - таким образом, я знаю, что Jboss отвечает на веб-запрос. При портировании его на silverlight 4, вызывает проблемы:
let uri = new Uri(queryUrl)
// this is the line that hangs
let request : HttpWebRequest = downcast WebRequest.Create(uri)
request.Method <- httpMethod;
request.ContentType <- contentType
Это может быть проблема песочницы, поскольку моя Silverlight подается прочь моей файловой системы, и Uri является ссылкой на localhost - хотя я даже не получаю исключение. Мысли?
Спасибо
ОБНОВЛЕНИЕ 1
Я создал новый проект и портировал мой код, и теперь он работает; что-то должно быть нестабильным отношением w/к интеграции Silverlight F# все еще. Все еще ценил бы мысли об отладке "зависающей" сети, создают в старой модели...
ОБНОВЛЕНИЕ 2
let uri = Uri("http://localhost./portal/main?isSecure=IbongAdarnaNiFranciscoBalagtas")
// this WebRequest.Create works fine
let req : HttpWebRequest = downcast WebRequest.Create(uri)
let Login = async {
let uri = new Uri("http://localhost/portal/main?isSecure=IbongAdarnaNiFranciscoBalagtas")
// code hangs on this WebRequest.Create
let request : HttpWebRequest = downcast WebRequest.Create(uri)
return request
}
Login |> Async.RunSynchronously
Я должен пропускать что-то; Асинхронная кладка блоков, прекрасная в консольном приложении - разве, это не позволяется в Приложении Silverlight?
Здесь похожая проблема - хотя нет ссылки на silverlight (на самом деле это «класс обслуживания Windows»):
Я думаю, что вы нажимаете на ограничение максимального количества http-соединений: смотрите Асинхронные вызовы веб-сервера в Silverlight и максимальное количество HTTP-соединений и http://weblogs.asp.net/mschwarz/archive/2008/07/21/internet-explorer-8-and-maximum-concurrent-connections.aspx
(Спасибо, что послали это в fsbugs, чтобы заставить нас внимательно посмотреть.)
Проблема в Async.RunSynchronously
. При вызове на потоке UI это блокирует поток UI. И получается, что WebRequest.Create()
на Silverlight диспетчеризируется на поток UI. Так что это тупик.
В общем, старайтесь избегать Async.RunSynchronously
на Silverlight (или на любом потоке UI). Вы можете использовать Async.StartImmediate
в этом примере. В качестве альтернативы, я думаю, вы можете вызвать RunSynchronously
из любого фонового потока без проблем. (Я сам не пробовал достаточного количества сквозных сценариев Silverlight, чтобы дать больше советов. Вы можете посмотреть
Программирование игр на F# (с Silverlight и WPF)
для нескольких коротких примеров).
(Оглядываясь назад, команда разработчиков F# считает, что нам, возможно, не следовало включать Async.RunSynchronously
в FSharp.Core для Silverlight; метод потенциально нарушает дух платформы (никаких блокирующих вызовов). Возможно, в будущих выпусках Silverlight мы откажемся от этого метода. С другой стороны, он все еще может быть использован для интенсивного параллелизма в Silverlight, например, для параллельного выполнения кучи кода (не связанного с IOS) в фоновых потоках.)