Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Передача файлов по сети, работа "долгих" методов / 25 сообщений из 33, страница 1 из 2
28.08.2008, 10:57
    #35510271
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Всем доброе утро! Стало нужно передавать большие (относительно 3~20Mb) по сети используя технологию WCF. Кто как это осуществляет. Интересен пример с реализацией Progress Bar'a при передаче файла. Еще есть другой вопрос. Есть метод, который мы используем удаленно с использованием WCF. Метод возвращает определнное значение. Этот метод может выполнятся как быстро, так и очень долго (в зависимости от кол-ва данных). В случае долгово выполнения метода клиент обрывает соединения не дожидаясь результата по timeout. TimeOut поставлен на максимум. Кто как выходит из такой ситуации ?
...
Рейтинг: 0 / 0
28.08.2008, 11:56
    #35510459
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Неужели нет у нас спецов по WCF ? Cкажите в чем лучше файл пережавать в byte[] или object ?
...
Рейтинг: 0 / 0
28.08.2008, 12:04
    #35510481
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
а в object - это как? передаёт?
По прогресс бару толко такой вариант пришёл в голову
Передавать файл мелкими частями, в первой части передать нужную инфу, а потом вычисляя по переданному размеру отрисовывать прогресс бар
с таймаутом думаю этот вариант тоже поможет
...
Рейтинг: 0 / 0
28.08.2008, 14:05
    #35510904
guinea-pig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
WCF может передавать файлы еще посредством стриминга (собственно, пришлось долго с этим разбираться, работать-то оно работает, но в случае очень больших файлов существуют проблемы, которые решить можно не всегда (например, если нужно сервис держать под IIS)).
Посмотрите код здесь: http://kjellsj.blogspot.com/2007/02/wcf-streaming-upload-files-over-http.html (стриминг)
А здесь - про индикацию процесса: http://www.gotdotnet.ru/Forums/DotNet3.0/484063.aspx

Еще вопрос - таймаутов у WCF много. Какие вы выставляли?
...
Рейтинг: 0 / 0
28.08.2008, 15:03
    #35511136
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
здесь разбирались, есть пример
...
Рейтинг: 0 / 0
28.08.2008, 16:04
    #35511328
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
webusНеужели нет у нас спецов по WCF ?

Webus, Вам надо сменить ник на Ребус. Вы заходите раз в 2 недели, задаёте уравнение с 10 неизвестными и пропадаете.
...
Рейтинг: 0 / 0
28.08.2008, 17:12
    #35511527
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
bured webusНеужели нет у нас спецов по WCF ?

Webus, Вам надо сменить ник на Ребус. Вы заходите раз в 2 недели, задаёте уравнение с 10 неизвестными и пропадаете.
Меня иногда так и называют. Вебус-Ребус ) Я не пропал. Работал, времени не было выйти на форум.
...
Рейтинг: 0 / 0
06.11.2008, 18:47
    #35638553
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Столкнулся с такой проблемой.
Есть WCF сервис через который можно получать файлы. Хостится он на ISS 7.0 и биндится по netTcpBinding
Клиент: WinForms
Передаю файлы на клиент через WCF сервис с использованием transferMode="Streamed". Т.е. в виде потока.
На клиенте из wcf сервиса я получаю поток System.IO.Stream.
Дальше всё просто: читаю данные из потока и сразу же (что бы клиент не замечал задержки) пишу эти данные на диск.
Проблема: при первом паралельном получении потоков всё гладко и шустро работает, при следуеших обращениях сервис просто висит, потом вылет по таймауту.
Прокси класс естественно закрыл... всё равно экземпляр сервиса висит... и при этом он блокируется... т.е. он перестаёт принимать другие запросы...
...
Рейтинг: 0 / 0
06.11.2008, 18:57
    #35638574
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Single)]

У вас наверняка сингтон стоит.
...
Рейтинг: 0 / 0
06.11.2008, 18:58
    #35638580
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Наврал. Лучше [ServiceBehavior(InstanceContextMode = InstanceContextMode. PerCall ,
ConcurrencyMode = ConcurrencyMode.Single)]
...
Рейтинг: 0 / 0
06.11.2008, 19:24
    #35638615
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
сапабо bured.

А почему при обращении к методам WCF сервиса, например
Stream response = service.GetStream(), проц грузится на 100%(наблюдается и в стимовом, и в буферном режимах)?
...
Рейтинг: 0 / 0
09.11.2008, 03:34
    #35642161
xeonet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Скажу так, видимо в реализации Stream режима в WCF есть баг, когда клиент выполнил операцию, и происходи отключение клиента, не срабатывает Faulted и вообще канал остаются открытым. Реально баг.

Для выполнения долгих операций нужно делать OperationTimeout большим, таким как надо. Но делать на стороне клиента!!! и сервера.

А делать надо так

private ChannelFactory<IAdministratorContract> _factory = new ChannelFactory<IAdministratorContract>


_contract = _factory.CreateChannel(endPointAddress);

IContextChannel context = _contract as IContextChannel;
if (context != null)
context.OperationTimeout = TimeSpan.FromMinutes(20);

Да и вообще скажу что Stream режим сделан для передачи файлов и потоков.
У меня сейчас проект, надо передавать большие выборки данных из базы данных, так я подкрутил WCF, что передаются данные огранниченные только
MaxReceivedMessageSize = int.MaxV
MaxBufferSize = int.MaxValue;
MaxBufferPoolSize = int.MaxValue;

т.е. огромные и это без использования Stream режима.
Так самое ещё прикольное, что ещё производится сжатие до 30 - 66 раз.
...
Рейтинг: 0 / 0
10.11.2008, 16:32
    #35644488
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
xeonet, а какая при этом нагрузка на проц клиента,
сначала я сделал закачку через буферний режим, только при этом были большие нагрузки на проц клиента - короче лажа полная. Потом я сделал через стримовый режим - проблема таймаут. Хотя при первом обращении к методу сервиса проц так же грузится на 100%. Да можна увеличить таймаут, а есть ли иное решение?
...
Рейтинг: 0 / 0
11.11.2008, 03:12
    #35645412
xeonet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
IIS не используем, делаем self хостинг.
По поводу загрузки процессора на 100, думаю это IIS виноват.

Не могу ничего дельного сказать по этому поводу, так как не использую IIS.

А какие объёмы файлов?
Какие стоят размеры BufferSize и др?
...
Рейтинг: 0 / 0
11.11.2008, 16:13
    #35647121
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
xeonet, MaxBufferPoolSize = 104857000, MaxReceivedMassageSize = 200000000
файлы размером 100Мб - 300Мб.
При буферном режиме таймаут не возникает, только при стримовом!
...
Рейтинг: 0 / 0
12.11.2008, 11:46
    #35648680
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Задам вопро гуру по AsyncPattern.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[ServiceContract()]
public interface IHDInterface
{
     [OperationContract]
        object SelectObject(object obj);
}

[ServiceContract()]
public interface IAHDInterface : IHDInterface
{
     [OperationContract(AsyncPattern=true)]
        IAsyncResult BeginSelectObject(object obj,AsyncCallback cb, object state);
        object EndSelectObject(IAsyncResult ar);
}

Вот такие интерфейсы. Сервер запускается так:
...
Рейтинг: 0 / 0
12.11.2008, 11:49
    #35648692
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Код: plaintext
ServiceHost sh3 = new ServiceHost(typeof(HDService), new Uri[] { });

т.е. от интерфейса HDService

Клиента реализовал так:

Код: plaintext
public class HDServiceClient : ClientBase<IAHDInterface>,IAHDInterface

т.е. от IAHDInterface по сути все верно но вылетает ошибка при вызове BeginSelectObject. Не пойму причем тут Action ?
...
Рейтинг: 0 / 0
12.11.2008, 12:39
    #35648884
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
please help
...
Рейтинг: 0 / 0
12.11.2008, 13:24
    #35649045
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Простите, может, немного не по сабжу, но - если юзать обычный asmx веб-сервис ? А бинарные данные переправлять как Base64?
...
Рейтинг: 0 / 0
12.11.2008, 13:26
    #35649052
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
МСУПростите, может, немного не по сабжу, но - если юзать обычный asmx веб-сервис ? А бинарные данные переправлять как Base64?

тут уже загвоздка не в бинарных данных а в самом AsyncPattern для WCF
...
Рейтинг: 0 / 0
12.11.2008, 20:06
    #35650306
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Проблему таймаута решил(надо было перед закритием канала делать клин для стрима), а вот с нагрузкой проца при первом обращении нет.
...
Рейтинг: 0 / 0
24.11.2008, 17:42
    #35672376
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
....
  using (Stream responseStream = client.GetData(
                string.Format("fileLink={0};transferedSize={1};fileKind={2}",
                CurrentRequest.FileName,
                CurrentRequest.TransferedSize,
                CurrentRequest.MaterialKind)))
            {
                int count = 0;
                int miliSec = 1;
                byte[] buffer = new byte[StreamChankSize];

                while (responseStream.CanRead &&
                    (count = responseStream.Read(buffer, 0, StreamChankSize)) > 0)                    
                {
                    writeStream.Write(buffer, 0, count);
                    writeStream.Flush();

                    fireProgressChangeEvent(writeStream, remoteFileInfo.Length, count / miliSec);
                }
                responseStream.Close();
            }
....
Тепер вопрос. Почему если StreamChankSize >= 4096 => count = 4096, хотя должно быть
count = StreamChankSize?
...
Рейтинг: 0 / 0
24.11.2008, 17:49
    #35672405
Taras611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
Хост на IIS 7.0
maxBufferPoolSize="104857000" maxReceivedMessageSize="200000000"
...
Рейтинг: 0 / 0
14.07.2009, 18:06
    #36089630
KolAA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
webusЗадам вопро гуру по AsyncPattern.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[ServiceContract()]
public interface IHDInterface
{
     [OperationContract]
        object SelectObject(object obj);
}

[ServiceContract()]
public interface IAHDInterface : IHDInterface
{
     [OperationContract(AsyncPattern=true)]
        IAsyncResult BeginSelectObject(object obj,AsyncCallback cb, object state);
        object EndSelectObject(IAsyncResult ar);
}

Вот такие интерфейсы. Сервер запускается так:

Нельзя повторять названия SelectObject и BeginSelectObject

надо сделать например SelectObject1 и BeginSelectObject
...
Рейтинг: 0 / 0
03.06.2010, 17:44
    #36667508
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF Передача файлов по сети, работа "долгих" методов
проблема не в передаче, а в конфига
передача это очень просто и решено ещё давно:

допустим в базе есть вопрос к которому надо боавить картинку и сохранить под айдишником вопроса
public bool SavePicture(byte[] pic, int IdQ)
{
bool Return = false;

try
{
FileUploader f = new FileUploader();

Return = f.SaveFile(IdQ.ToString(), pic);
if (Return)
{
DataTestsDataContext db = new DataTestsDataContext();
var Quest = from p in db.Questions where p.IdQ == IdQ select p;
foreach (var Id in Quest)
{
Id.Pic = "data" + IdQ.ToString();
Return = true;
}
return Return;
}
}
catch (Exception ex)
{
Trace.TraceError("SavePicture error: " + ex.Message);
}

return Return;
}


вспомогательный класс для закачки


public class FileUploader
{
public bool SaveFile(string fileName, byte[] fileContent)
{
bool ret = false;
try
{
String path = AppDomain.CurrentDomain.BaseDirectory + @"data\" + fileName;
if (File.Exists(path))
{
File.Delete(path);
}

File.WriteAllBytes(path, fileContent);
ret = true;
}
catch (Exception ex)
{
Trace.TraceError("FileUploader.SaveFile error: " + ex.Message);
}

return ret;
}
}


почти всё работает, единственная проблема что файл передаётся размером не более 60 кб
надо в web.config править, но тут у меня ни чего не получается
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Передача файлов по сети, работа "долгих" методов / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]