2013-04-29 3 views
0

Я не могу отправить поток, используя привязку net.tcp. У меня есть MessageContract для передачи данных, и WCF проходит в FileName, но поток FileByteStream пустWCF не отправляет поток (привязка net.tcp)

[MessageContract] 
public class FileUploadMessage 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public string Filename; 
    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream; 
} 

Моя служба:

[ServiceContract] 
public interface ISlaveService 
{ 
    [OperationContract] 
    FileUploadMessage SendPattern(FileUploadMessage image); 
} 

внедрение Service (как для отправки и возвращения потока не работают):

public FileUploadMessage SendPattern(FileUploadMessage image) 
{ 
    try 
    { 
     ImageSource source = BitmapFrame.Create(image.FileByteStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
     MainWindow.Instance.imagePattern.Source = source; 

     Stream imageStream2 = File.OpenRead(@"C:\aaa.jpg"); 
     image.FileByteStream = imageStream2; 
     return image; 
    } 
    catch (Exception ex) 
    { 
     // TODO: add log 
     return null; 
    } 
} 

Запуск службы:

public static void StartService() 
{ 
    try 
    { 
     Uri tcpUrl = new Uri("net.tcp://localhost:" + Config.Instance().LocalPort + "/SlaveService"); 

     host = new ServiceHost(typeof(SlaveService), tcpUrl); 

     NetTcpBinding tcpbinding = new NetTcpBinding(); 
     tcpbinding.Security.Mode = SecurityMode.None; 
     tcpbinding.TransferMode = TransferMode.Streamed; 
     tcpbinding.MaxReceivedMessageSize = 2147483647; 
     tcpbinding.ReaderQuotas.MaxArrayLength = 2147483647; 
     tcpbinding.ReaderQuotas.MaxBytesPerRead = 2147483647; 
     tcpbinding.ReaderQuotas.MaxStringContentLength = 2147483647; 
     tcpbinding.ReaderQuotas.MaxDepth = 2147483647; 
     host.AddServiceEndpoint(typeof(ISlaveService), tcpbinding, "net.tcp://localhost:" + Config.Instance().LocalPort + "/SlaveService"); 

     ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
     smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
     host.Description.Behaviors.Add(smb); 

     host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexTcpBinding(), 
     "net.tcp://localhost:" + Config.Instance().LocalPort + "/SlaveService/mex"); 

     host.Open(); 
    } 
    catch (Exception ex) 
    { 
     //TO DO: Logger.Add("Failed to start Slave service. " + ex.Message); 
    } 
} 
Подключение

Клиента:

public bool Connect(string address) 
{ 
    NetTcpBinding tcpbinding = new NetTcpBinding(); 
    tcpbinding.Security.Mode = SecurityMode.None; 
    tcpbinding.TransferMode = TransferMode.Streamed; 
    tcpbinding.MaxReceivedMessageSize = 2147483647; 
    tcpbinding.ReaderQuotas.MaxArrayLength = 2147483647; 
    tcpbinding.ReaderQuotas.MaxBytesPerRead = 2147483647; 
    tcpbinding.ReaderQuotas.MaxStringContentLength = 2147483647; 
    tcpbinding.ReaderQuotas.MaxDepth = 2147483647; 

    EndpointAddress endpoint = new EndpointAddress("net.tcp://" + address + "/SlaveService"); 
    var channelFactory = new ChannelFactory<ISlaveService>(tcpbinding, endpoint); 
    client = null; 

    try 
    { 
     client = channelFactory.CreateChannel(); 
    } 
    catch (Exception e) 
    { 
     Logger.Add("Exception occured while trying to connect. " + e.Message); 
     if (client != null) 
     { 
      ((ICommunicationObject)client).Abort(); 
     } 

     return false; 
    } 

    return true; 
} 

Я могу отправить текст и цифры, но когда я пытаюсь отправить поток он посылает пустой поток. Я краснею на форумах, что MaxReceivedMessageSize должен быть решением, но он не решает мою проблему. Пожалуйста, помогите

ответ

0

Контракт должен быть:

[OperationContract] 
    FileUploadMessage SendPattern(Stream image); 
+1

Я попробовал это, я добавил FileUploadMessage после использования потока. Этот код работает, когда я отправляю файл в виде байтового массива вместо потока. Я не знаю, почему – lmmalino

Смежные вопросы