Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Получение списка файлов со стороны сервера


Автор: IHELLRAiSERI 27.8.2010, 07:24
Доброго!
Кто сможет подсказать как получить список файлов в Silverlight из папки на стороне сервера?
Для примера:
Нужно прочитать папку там же, где и запускается приложение (НЕ локальную на стороне пользователя, хотя и с этим проблемы, нет доступа к папке), посчитать файлы jpg, создать стока же элементов image в приложении, и загрузить в них картинки. Код лучше на VB, но если что то и на C разберусь.

Автор: jonie 27.8.2010, 13:35
Ну я бы предложил обмениваться по RESTful протоколу с SL приложением.
В VS2010 есть готовый проект WCF REST application, давите его (если надо качаете его из online templates).
В коде сервиса пишите:
Код

    public class FsItem
    {
        public string Name { get; set; }
        public bool IsDirectory { get; set; }
    }

    // Start the service and browse to http://<machine_name>:<port>/Service1/help to view the service's generated help page
    // NOTE: By default, a new instance of the service is created for each call; change the InstanceContextMode to Single if you want
    // a single instance of the service to process all calls.    
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    // NOTE: If the service is renamed, remember to update the global.asax.cs file
    public class Service1
    {
        // TODO: Implement the collection resource that will contain the SampleItem instances

        [WebGet(UriTemplate = "/?path={path}")]
        public List<FsItem> GetCollection(string path)
        {
            DirectoryInfo di = new DirectoryInfo(path);
            List<FsItem> rv = new List<FsItem>();
            
            rv.AddRange(di.GetFiles().Select(x => new FsItem() { Name = x.Name, IsDirectory = false }));
            rv.AddRange(di.GetDirectories().Select(x => new FsItem() { Name = x.Name, IsDirectory = true }));

            return rv;
        }

    }


Вуаля, у вас есть сервис, которй по адресу http://localhost:XXX/Service1/?path=C:\ выдаст вам массив FsItem-ов.

Далее в лепите Silverlight приложение (при этом важно чтоб хостили в одном проекте*), в нем на форму бросаете ListBox (с именем resultLB), в коде пишите примерно такое:
Код

        private void ListBox_Loaded(object sender, RoutedEventArgs e)
        {
            ListBox lb = (ListBox)sender;
            string serviceBaseUrl = "http://localhost:3404/Service1/";
            string query = "?path=c:\temp";

            WebClient client = new WebClient();
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(SearchRecipesByNameCompleted);
            client.DownloadStringAsync(new Uri(serviceBaseUrl + query, UriKind.Absolute));

        }

        void SearchRecipesByNameCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            XDocument xml = XDocument.Parse(e.Result);

            var dirInfoList = xml.Descendants("ArrayOfFsItem")
                .Nodes()
                .Select(node => ((XElement)node).Element("Name"));

            resultLB.ItemsSource = dirInfoList.ToList();
        }


*)Прочитайте про Access-Control-Allow-Origin  тут https://developer.mozilla.org/en/docs/HTTP_access_control
Вам придется ставить его, если сервис WCF будет на другом хосте, нежели SL хостящий проект. Это поле можно поставить в IIS вручную.

Автор: IHELLRAiSERI 27.8.2010, 13:49
jonie, За информацию Спасибо! Я еще совсем новичок. Просто надо написать приложение. Над темой подумаю. Вот тока хост не IIS а Unix.

Автор: jonie 27.8.2010, 15:59
IHELLRAiSERI, ну ничего не мешает вам реализовать RESTful сервис например на php, это же просто XML-ка в ответ на HTTP GET запрос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)