powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Передача файлов по сети, работа "долгих" методов
25 сообщений из 33, страница 1 из 2
WCF Передача файлов по сети, работа "долгих" методов
    #35510271
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброе утро! Стало нужно передавать большие (относительно 3~20Mb) по сети используя технологию WCF. Кто как это осуществляет. Интересен пример с реализацией Progress Bar'a при передаче файла. Еще есть другой вопрос. Есть метод, который мы используем удаленно с использованием WCF. Метод возвращает определнное значение. Этот метод может выполнятся как быстро, так и очень долго (в зависимости от кол-ва данных). В случае долгово выполнения метода клиент обрывает соединения не дожидаясь результата по timeout. TimeOut поставлен на максимум. Кто как выходит из такой ситуации ?
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35510459
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели нет у нас спецов по WCF ? Cкажите в чем лучше файл пережавать в byte[] или object ?
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35510481
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в object - это как? передаёт?
По прогресс бару толко такой вариант пришёл в голову
Передавать файл мелкими частями, в первой части передать нужную инфу, а потом вычисляя по переданному размеру отрисовывать прогресс бар
с таймаутом думаю этот вариант тоже поможет
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35510904
guinea-pig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
WCF Передача файлов по сети, работа "долгих" методов
    #35511136
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь разбирались, есть пример
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35511328
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webusНеужели нет у нас спецов по WCF ?

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

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

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

А почему при обращении к методам WCF сервиса, например
Stream response = service.GetStream(), проц грузится на 100%(наблюдается и в стимовом, и в буферном режимах)?
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35642161
xeonet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажу так, видимо в реализации 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
WCF Передача файлов по сети, работа "долгих" методов
    #35644488
Taras611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xeonet, а какая при этом нагрузка на проц клиента,
сначала я сделал закачку через буферний режим, только при этом были большие нагрузки на проц клиента - короче лажа полная. Потом я сделал через стримовый режим - проблема таймаут. Хотя при первом обращении к методу сервиса проц так же грузится на 100%. Да можна увеличить таймаут, а есть ли иное решение?
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35645412
xeonet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IIS не используем, делаем self хостинг.
По поводу загрузки процессора на 100, думаю это IIS виноват.

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

А какие объёмы файлов?
Какие стоят размеры BufferSize и др?
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35647121
Taras611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xeonet, MaxBufferPoolSize = 104857000, MaxReceivedMassageSize = 200000000
файлы размером 100Мб - 300Мб.
При буферном режиме таймаут не возникает, только при стримовом!
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35648680
Фотография 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);
}

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

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

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

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

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

тут уже загвоздка не в бинарных данных а в самом AsyncPattern для WCF
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35650306
Taras611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблему таймаута решил(надо было перед закритием канала делать клин для стрима), а вот с нагрузкой проца при первом обращении нет.
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #35672376
Taras611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
WCF Передача файлов по сети, работа "долгих" методов
    #35672405
Taras611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хост на IIS 7.0
maxBufferPoolSize="104857000" maxReceivedMessageSize="200000000"
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36089630
KolAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
WCF Передача файлов по сети, работа "долгих" методов
    #36667508
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема не в передаче, а в конфига
передача это очень просто и решено ещё давно:

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


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