Windows Communication Foundation - stahování souboru znepřístupní službu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Windows Communication Foundation - stahování souboru znepřístupní službu – .NET – Fórum – Programujte.comWindows Communication Foundation - stahování souboru znepřístupní službu – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Gramli0
Duch
4. 7. 2014   #1
-
0
-

Zdravím, 
mám dotaz ohledně stahování souborů ze služby, kterou jsem vytvořil. 
Chtěl bych aby posílání souborů ze služby probíhalo tak, aby to službu "Nezasekalo" -> aby mohl stahovat ze služby v daném okamžiku i někdo jiný. 

v Interface je metoda definována takto:  

[OperationContract] 
[FaultContract(typeof(CustomException))] 
RemoteFileInfo DownloadFile(DownloadRequest request); 

[MessageContract] 
public class RemoteFileInfo : IDisposable 
{ 
[MessageHeader(MustUnderstand = true)] 
public string FileName; 

[MessageHeader(MustUnderstand = true)] 
public long Length; 

[MessageHeader(MustUnderstand=true)] 
public Login login; 

[MessageBodyMember(Order = 1)] 
public System.IO.Stream FileByteStream; 

public void Dispose() 
{ 
    if (FileByteStream != null) 
    { 
        FileByteStream.Close(); 
        FileByteStream = null; 
    } 
} 
} 

kód metody DownloadFile

public RemoteFileInfo DownloadFile(DownloadRequest request) 
        { 
                    if (!CheckUser(request.login)) 
                    { 
                        CustomException my = SetException("Login error", "Invalid UserName or Password", "", ""); 
                        throw new FaultException<CustomException>(my); 
                    } 

                    RemoteFileInfo result = new RemoteFileInfo(); 
                    try 
                    { 
                        string filePath = request.FileAdress; 
                        System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); 

                        // check if exists 
                        if (!fileInfo.Exists) 
                            throw new FileNotFoundException("File not found", request.FileName); 

                        // open stream 
                        FileStream stream = new System.IO.FileStream(request.FileAdress, FileMode.Open, System.IO.FileAccess.Read); 
                        // return result 
                        result.FileName = request.FileName; 
                        result.Length = fileInfo.Length; 
                        result.FileByteStream = stream; 

                    } 
                    catch (Exception ex) 
                    { 
                        CustomException my = SetException("Error function: DownloadFile", ex.Message, ex.InnerException.Message, ex.StackTrace); 
                        throw new FaultException<CustomException>(my); 
                    } 
                    return result; 
        } 

dále behavior mám nastaveno takto:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class Streaming : ServiceInterface 

Služba je self-hosted a spouštím mám ji nastavenou takto:

//Create a URI to serve as the base address 
                Uri httpUrl = new Uri("http://localhost:8092/PSIService"); 
                //Create ServiceHost 
                _host = new ServiceHost(typeof(Service.Streaming), httpUrl); 

                //Set binding 
                BasicHttpBinding hostBinging = SetBinding(); 

                ServiceMetadataBehavior smb = _host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
                if (smb == null) 
                { 
                    smb = new ServiceMetadataBehavior(); 
                    smb.HttpGetEnabled = true; 
                    _host.Description.Behaviors.Add(smb); 
                } 

                //Add a service endpoint 
                _host.AddServiceEndpoint(typeof(Service.ServiceInterface), hostBinging, ""); 
                //Enable metadata exchange 
                // checking and publishing meta data 
                //Start the Service 
                _host.Open(); 

Máte s tímto někdo zkušenosti? Budu rád, za každou radu :)  

Dodatek: je to self-hosted služba a připojuji se k ní pomocí klienta s ChannelFactory. Klient ani hostovací aplikace nemají nastavení v configuračním souboru, ale přímo v kódu.

Nahlásit jako SPAM
IP: 94.112.108.–
Reklama
Reklama
p3can
~ Anonymní uživatel
312 příspěvků
5. 7. 2014   #2
-
0
-

a jak si presne poznal ze to nejde pro jineho klienta ?

muzes jeste rozepsat SetBinding() ?

kdyz das break point na server metodu DownloadFile nekde na zacatek a zavolas druhy request behem stahovani prvniho souboru tak se stane co ?

Nahlásit jako SPAM
IP: 77.92.213.–
Gramli0
Duch
5. 7. 2014   #3
-
0
-

#2 p3can
Spustil jsem dva klienty, na jednom jsem začal stahovat a u druhého jsem zavolal jednoduchou metodu ze služby která vrací string. Metoda se provedla až poté co se dostahoval soubor.

binding:

hostBinging.SendTimeout = new TimeSpan(0, 20, 0);
            hostBinging.ReceiveTimeout = new TimeSpan(0, 20, 0);
            hostBinging.CloseTimeout = new TimeSpan(0, 20, 0);
            hostBinging.OpenTimeout = new TimeSpan(0, 20, 0);
            hostBinging.MaxBufferPoolSize = 2147483647;
            hostBinging.MaxReceivedMessageSize = 2147483647;
            hostBinging.MaxBufferSize = 2147483647;
            hostBinging.TransferMode = System.ServiceModel.TransferMode.Streamed;
            hostBinging.MessageEncoding = WSMessageEncoding.Mtom;

Dal jsem breakpoint na zacatek metody, zacal jsem stahovat z prvniho klienta a kdyz jsem dal stahovat i z druheho klienta, tak jsem zase cekal nez dostahuje prvni.

Nahlásit jako SPAM
IP: 94.112.108.–
Gramli0
Duch
5. 7. 2014   #4
-
0
-

#3 Gramli
Edit: U klienta spouštím downloadFile v tasku a když stahuju z jednoho klienta a chci začít stahovat z druhého klienta, tak druhý klient neodpovídá.. 

Nahlásit jako SPAM
IP: 94.112.108.–
Gramli0
Duch
5. 7. 2014   #5
-
0
-

#4 Gramli
Tak jsem to vyřešil -> hostuji totiž aplikaci ve WF a ta podle všeho nedovoluje použít multithreading. Vytvořil jsem tedy ServiceHost v jiném vlákně a vše funguje jak má :) 

Nahlásit jako SPAM
IP: 94.112.108.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý