Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата


WebClient, ведь, открывает поток для записи данных в ресурс url. 

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. 

 smile

Автор: 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 стартовая директория не то где вы смотрите. Использовать надо нечто вроде:
Код

        string appDataPath = HttpContext.Current.Server.MapPath("~/App_Data/Example.xml");

чтобы разрешить виртуальный путь в реальный.

Автор: ad12 14.1.2011, 12:58
Спасибо большое, jonie!
Работает.

Ещё, может, подскажите.
Вот метод у WebService - HelloWorld().
А как передать ему параметр?
При вызове web.HelloWorldAsync(); ?
Или как-то ещё?

Автор: jonie 14.1.2011, 13:31
Цитата(ad12 @  14.1.2011,  12:58 Найти цитируемый пост)
Вот метод у WebService - HelloWorld().
А как передать ему параметр?
При вызове web.HelloWorldAsync(); ?
Или как-то ещё?

такому методу никак - он не принимает у вас аргументов вообще же: HelloWorld().
Впишите аргументы, перегенерируйте прокси класс и они (аргументы) появятся в HelloWorldAsync-е

Автор: ad12 14.1.2011, 15:52
Не получается перегенерировать прокси класс.
"Возникла ошибка при загрузке метаданных с указанного адреса.
Проверьте корректность введённого адреса"


Адрес: http://localhost:50055/WebService1.asmx  smile 

Автор: jonie 14.1.2011, 18:28
ad12, ну и что? Перейдите в браузере на 
Адрес: http://localhost:50055/WebService1.asmx?wsdl и посмотрите есть ли эти самые секретные данные... и на сервере проставьте в web.config такое
Код

<serviceBehaviors>
   <behavior name="EmployeeManager_Behavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="true" />
   </behavior>
</serviceBehaviors>
чтобы видеть всё из ошибки

Автор: 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
Цитата(ad12 @  17.1.2011,  12:04 Найти цитируемый пост)

Если я добавлю HelloWorld(XDocument _xdoc),
то нужно перерегистрировать класс, так?
Я пытаюсь "Добавить ссылку на службу", выбираю адрес http://localhost:50055/WebService1.asmx,
пространоство имён предлагается новое ServiceReference2, давлю OK и получаю сообщение как в предыдущем моём посте... 

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("Мой параметр"); - не получается  smile 



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