powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Передача файлов по сети, работа "долгих" методов
33 сообщений из 33, показаны все 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
WCF Передача файлов по сети, работа "долгих" методов
    #36667519
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у других людей всё получалось использую вот такой конфиг:
<?xml version="1.0"?>

<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />

<httpRuntime
executionTimeout="1200"
maxRequestLength="102400"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100" />
</system.web>
<system.diagnostics>
<sharedListeners>
<add name="WcfListener"
type="System.Diagnostics.XmlWriterTraceListener" initializeData="d:\log.svclog"
/>
</sharedListeners>
<sources>
<!-- switchValue attribute has no impact on MessageLogging -->
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="WcfListener" />
</listeners>
</source>
<source name="System.ServiceModel"
switchValue="Warning, ActivityTracing"
propagateActivity="true" >
<listeners>
<add name="WcfListener" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="30000000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<bufferedReceive maxPendingMessagesPerChannel="2147483647"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions ="1000"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="" maxReceivedMessageSize="300000000" maxBufferSize="300000000">
<readerQuotas maxArrayLength="30000000" maxStringContentLength="300000000"/>
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="True" aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
<connectionStrings>
<add name="connString"
connectionString="Server=BY047\SQLEXPRESS;Database=TRI_Portal_DataBase;Trusted_Connection=True;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

но у меня в этих конфигах выдаёт ошибку в 2х местах, не знаю что делать
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36667523
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wertyBSDу других людей всё получалось использую вот такой конфиг
Так и тут у всех всё получилось. Были проблемы на IIS 5 с файлами больших размеров. Сейчас это уже не актуально.
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36667538
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но у меня не работаеn:

<bufferedReceive maxPendingMessagesPerChannel="2147483647"/>
пишет что он не является потомком behavior

<serviceHostingEnvironment multipleSiteBindingsEnabled="True" aspNetCompatibilityEnabled="true"/>
атрибут multipleSiteBindingsEnabled не допускается
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36667561
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее всего там, где Вы это содрали реализовано Поведение (Behavior) службы
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36674035
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё равно не работает
может всё дело в этом грёбаном silverlight
сейчас попробую передать файл пару метров с консоли
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36674062
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал с консоли послать

static void Main(string[] args)
{
Service1Client basereader = new Service1Client();
FileInfo selectedFile = new FileInfo(@"d:\folder.jpg");
byte[] fileContent = new byte[selectedFile.Length];
using (FileStream fs = selectedFile.OpenRead())
{
Console.WriteLine(fs.Length);
fs.Read(fileContent, 0, Convert.ToInt32(fs.Length));
fs.Close();
}


try
{
basereader.SavePic(fileContent, 13);
}
catch(Exception e)
{
Console.WriteLine(e);
TextWriter text = new StreamWriter(@"D:\error.txt");
text.Write(e);
}
Console.Read();

}

ошибка:

System.ServiceModel.ProtocolException: The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'SavePic'. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 45451.

Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOper
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36674729
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wertyBSD,

ну эта известная настройка. что ты прям горячишься.
XmlDictionaryReaderQuotas создаешь этот объект, изменяешь в нем MaxArrayLength
и присваиваешь этот объект своей проксе.
все уже сделано,просто тебе знаний не хватает.
...
Рейтинг: 0 / 0
WCF Передача файлов по сети, работа "долгих" методов
    #36697750
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мы избежали передачи через сервис, в сильверлайт передаём данные через хэндлер
создали ashx с кодом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.Services;

namespace TestingTool.Web
{

/// <summary>
/// Summary description for FileUpload
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class FileUpload : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
HttpRequest request = context.Request;
HttpResponse response = context.Response;
HttpServerUtility server = context.Server;

string fileName = context.Request.Params["filename"];
if (!string.IsNullOrEmpty(fileName))
{
using (Stream inputStream = request.InputStream)
{
#region конструирование пути к папке с картинками
// ..//DBWcfService//data

string folder = System.AppDomain.CurrentDomain.BaseDirectory;

folder = folder.Remove(folder.Length - 1, 1);

while ((folder.Length > 0) && (folder[folder.Length - 1] != '\\'))
folder = folder.Remove(folder.Length - 1, 1);

folder += "DBWcfService\\data";
#endregion

using (FileStream fs = new FileStream(folder + @"\" + fileName, FileMode.OpenOrCreate))
{
byte[] fileContent = new byte[inputStream.Length];
inputStream.Read(fileContent, 0, fileContent.Length);
fs.Write(fileContent, 0, fileContent.Length);
fs.Flush();
}
}
response.Clear();
response.End();
}
}

public bool IsReusable
{
get
{
return false;
}
}
}
}


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


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