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.