| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > silverlight запись файла с помощью WebClient |
| Автор: ad12 11.1.2011, 21:06 |
| С Новым годом всех! VS2010. Silverlight 4. C#. Silverlight браузерное приложение. Нужно создать файл на моём хосте. XDocument xdoc; Формирую xml документ: xdoc = new XDocument(new XElement("element1")); Затем пытаюсь записать его на свой хост в файл 1.xml: Uri url = new Uri("1.xml", UriKind.RelativeOrAbsolute); WebClient client = new WebClient(); client.OpenWriteCompleted += new OpenWriteCompletedEventHandler(client_OpenWriteCompleted); client.OpenWriteAsync(url, "POST"); //обработчик события void client_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) { xdoc.Save((Stream)e.Result); } При исполнении файл 1.xml на временном локальном хосте не создаётся. Что-то не так? |
| Автор: jonie 11.1.2011, 21:19 |
| ad12, а серверная часть где собственно сохранения? |
| Автор: ad12 12.1.2011, 10:12 |
| Прошу прощения - а какая серверная часть? Разве WebClient'а недостаточно? WebClient, ведь, открывает поток для записи данных в ресурс url. |
| Автор: jonie 12.1.2011, 14:48 | ||
ad12, где вы такое прочитали? Он просто выполняет HTTP(s) запрос, и не более. Кто-то на сервере должен принять и обработать должным образом этот запрос иначе ничего не случится. |
| Автор: ad12 12.1.2011, 16:33 |
| jonie Из справки MSDN: OpenWriteAsync - метод Silverlight Другие версии .NET Framework 4 .NET Framework 3.5 Открывает поток для записи данных в указанный ресурс |
| Автор: jonie 12.1.2011, 20:47 |
| ad12, ну пусть и так. А где вы прочитали что поток для записи должен записывать файл? Вот тут я полноценно ответил на ваши вопросы http://forum.vingrad.ru/index.php?showtopic=319972&view=findpost&p=2281675 |
| Автор: ad12 13.1.2011, 14:08 |
| Спасибо, jonie. Попытаюсь разобраться. Пока что запустил Ваш солюшн в студии и при исполнении получил выговор: System.ServiceModel.CommunicationException не обработано пользовательским кодом Message=Произошла ошибка при попытке создать запрос к URI "http://localhost:2987/Service1.svc". Это могло быть вызвано попыткой междоменного доступа к службе без наличия приемлемой междоменной политики или с политикой, непригодной службам SOAP. Может понадобиться связаться с владельцем службы для публикации файла междоменной политики и убедиться в том, что она позволяет отправлять заголовки HTTP, связанные с SOAP. Эта ошибка также может быть вызвана использованием внутренних типов в прокси-сервере веб-службы без использования атрибута InternalsVisibleToAttribute. |
| Автор: jonie 13.1.2011, 15:11 |
| ad12, ну настройки у вас при сборке которые вероятно не такие как у меня получаются. Проверяйте адрес на котором стартует asp.net developer server |
| Автор: ad12 13.1.2011, 17:47 |
| jonie, Отвлеку ещё немного. Всё тянет попроще сделать. Добавляю к проекту новый элемент - Web Service. Код службы может быть примерно такой: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Xml.Linq; namespace SilverlightApplication_1.Web { /// <summary> /// Сводное описание для WebService1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // Чтобы разрешить вызывать веб-службу из скрипта с помощью ASP.NET AJAX, раскомментируйте следующую строку. // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { XDocument xdoc = XDocument.Load("1.xml"); XElement xe = new XElement("HelloWorld"); xdoc.Element("persons").Add(xe); xdoc.Save("1.xml"); rerturn "Hello world"; } } } Генерирую прокси класс (как положено) ServiceReference1.WebService1SoapClient На главной форме приложения - кнопка button1 и textblock1 private void button1_Click(object sender, RoutedEventArgs e) { ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient(); web.HelloWorldCompleted += new EventHandler<ServiceReference1.HelloWorldCompletedEventArgs>(web_HelloWorldCompleted); web.HelloWorldAsync(); } void web_HelloWorldCompleted(object sender, ServiceReference1.HelloWorldCompletedEventArgs e) { textblock1.text = e.Result; } Кладу на хост файл 1.xml Запускаю приложение. Работает только Hello World С файлом 1.xml ничего не происходит. Почему? |
| Автор: jonie 13.1.2011, 18:32 | ||
ad12, потому что пишите вы файл черти-куда (а точнее в Windows\Microsoft.NET\ или что-то подобное). Это в свою очередь потому что у IIS стартовая директория не то где вы смотрите. Использовать надо нечто вроде:
чтобы разрешить виртуальный путь в реальный. |
| Автор: ad12 14.1.2011, 12:58 |
| Спасибо большое, jonie! Работает. Ещё, может, подскажите. Вот метод у WebService - HelloWorld(). А как передать ему параметр? При вызове web.HelloWorldAsync(); ? Или как-то ещё? |
| Автор: ad12 14.1.2011, 15:52 |
| Не получается перегенерировать прокси класс. "Возникла ошибка при загрузке метаданных с указанного адреса. Проверьте корректность введённого адреса" Адрес: http://localhost:50055/WebService1.asmx |
| Автор: jonie 14.1.2011, 18:28 | ||
| ad12, ну и что? Перейдите в браузере на Адрес: http://localhost:50055/WebService1.asmx?wsdl и посмотрите есть ли эти самые секретные данные... и на сервере проставьте в web.config такое
|
| Автор: ad12 17.1.2011, 12:04 |
| jonie, ничего не получается. Попробую уточнить - над чем бьюсь. Я отлаживаю проект на локальном хосте, созданном VS2010, соответственно ASP.NET Development Server - Порт 50055 В свойствах проекта в разделе Веб->Серверы отмечено Использовать Visual Studio Development Server->Указанный порт 50055 В сгенерированном прокси-классе метод HelloWorld() - без параметров. Если я добавлю HelloWorld(XDocument _xdoc), то нужно перерегистрировать класс, так? Я пытаюсь "Добавить ссылку на службу", выбираю адрес http://localhost:50055/WebService1.asmx, пространоство имён предлагается новое ServiceReference2, давлю OK и получаю сообщение как в предыдущем моём посте... |
| Автор: jonie 17.1.2011, 13:14 | ||
XDocument не является сериализующимся классом. Передавайте и возвращайте строки, которые парсите соотвествующим образом. И вообще пора бы использовать WCF. Старые ASMX сервисы устарели... |
| Автор: ad12 17.1.2011, 14:51 |
| jonie, спасибо. С WCF я разберусь. Сразу после asmx сервисов. Всё-таки, не могу понять - как передать параметр методу WebService'а (HelloWorld). В описание метода вставляю параметр - строку: public string HelloWorld(string _xdoc) { ... } В клиентской части следующий код: ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient(); web.HelloWorldCompleted += new EventHandler<ServiceReference1.HelloWorldCompletedEventArgs>(web_HelloWorldCompleted); web.HelloWorldAsync(); Куда тут поставить параметр? Пробую поставить web.HelloWorldAsync("Мой параметр"); - не получается |