none
Web Servis - Hatalı WebMethod dönüş tipi RRS feed

  • Soru

  • Merhabalar,

    Web servisimde System.IO.Stream tipinde bir metodum var.

    [WebMethod]
    public System.IO.Stream GetDYFtpWebRequestStream(string firmName, string filePath)
    {
        string ftpAdress = ftpServer + ":" + ftpPort + "/" + ftpFolder + "/" + firmName + "/" + Path.GetFileName(filePath);
        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpAdress);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(ftpUser, ftpPass);
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = true;
        //request.ReadWriteTimeout = System.Threading.Timeout.Infinite;
        //request.Timeout = System.Threading.Timeout.Infinite;
        //request.ServicePoint.Expect100Continue = false;
        //request.ConnectionGroupName = "grp";
        return request.GetRequestStream();
    }


     Bu metodu bir Windows hizmetinde bir dosyayı FTP ye yüklemek için aşağıdaki şekilde kullanmak istiyorum.

    using (var fs = File.OpenRead(filePath))
    
        {
        
            System.IO.Stream ftpStream = Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
            fs.CopyTo(ftpStream);
            ftpStream.Close();
            status = "Dosya başarıyla " + ftpAdress + " adresine yüklendi!";
            return status;
        
        }

    Fakat bu metodu çağırdığım satırda aşağıdaki hatayı alıyorum:

    " Cannot implicitly convert type 'DBBackupWinService.LicenceService.Stream' to 'System.IO.Stream' "

    Web servisteki metodun tipini yanlış görüyor. Buradaki amacım FTP bilgilerinin web servis kısmında tutulup uygulama kısmında tutulmaması. Bu şekilde kullanım mantıklı mıdır? Mantıklı ise hatayı nasıl çözebilirim ?

    Teşekkür ederim.

    6 Aralık 2020 Pazar 21:49

Yanıtlar

  • Aşağıdaki şekilde deneyebilir misiniz.

    Notları dikkate alınız.

    [WebMethod]
    public System.IO.Stream GetDYFtpWebRequestStream(string firmName, string filePath)
    {
            using(System.IO.Stream newStream = new System.IO.MemoryStream()){
                string ftpAdress = ftpServer + ":" + ftpPort + "/" + ftpFolder + "/" + firmName + "/" + Path.GetFileName(filePath);
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpAdress);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(ftpUser, ftpPass);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = true;
                //Eğer dönüş tipinde hala problem var ise hatayı artık burada almalısınız.
                newStream = (System.IO.Stream)request.GetRequestStream();
                //bu noktaya kesme koyarak verinin dolu geldiğini, VS üzerinden onaylayın.
                return newStream;
            };
    }
    
    
    using (var fs = File.OpenRead(filePath))
    {
            System.IO.Stream ftpStream = null;
            ftpStream = (System.IO.Stream)Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
            fs.CopyTo(ftpStream);
            ftpStream.Close();
            status = "Dosya başarıyla " + ftpAdress + " adresine yüklendi!";
            return status;
    }

    Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz



    11 Aralık 2020 Cuma 08:17

Tüm Yanıtlar

  • Yapmak istediğim şey FtpWebRequest sınıfının GetRequestStream metodunu kendi WebServisim üzerinden diğer uygulamamda kullanmak üzere döndermek. İlk başta yazan kod benim System.IO.Stream tipindeki GetRequestStream metodunu döndüren metodum. İkinci yazan kod ise benim uygulamam.

    System.IO.Stream ftpStream = Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
    Bu satırda hata alıyorum. Hem metodun hem de örneğimin tipi aynı olmasına rağmen konuda yazan hatayı veriyor. 

    10 Aralık 2020 Perşembe 13:10
  • Yapmak istediğim şey FtpWebRequest sınıfının GetRequestStream metodunu kendi WebServisim üzerinden diğer uygulamamda kullanmak üzere döndermek. İlk başta yazan kod benim System.IO.Stream tipindeki GetRequestStream metodunu döndüren metodum. İkinci yazan kod ise benim uygulamam.

    System.IO.Stream ftpStream = Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
    Bu satırda hata alıyorum. Hem metodun hem de örneğimin tipi aynı olmasına rağmen konuda yazan hatayı veriyor. 

    Başlangıçta nesnenizi null olarak tanımlamak ve dönüş değerinizi tekrar tür değiştirmeye zorlamak probleminizi çözebilir.

        using (var fs = File.OpenRead(filePath))
        {
            using ftpStream = System.IO.Stream;
            ftpStream = null;
            ftpStream = (System.IO.Stream)Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
            fs.CopyTo(ftpStream);
            ftpStream.Close();
            status = "Dosya başarıyla " + ftpAdress + " adresine yüklendi!";
            return status;
        }



    Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz

    10 Aralık 2020 Perşembe 13:45
  • Maalesef sonuç yine aynı..
    10 Aralık 2020 Perşembe 15:31
  • Aşağıdaki şekilde deneyebilir misiniz.

    Notları dikkate alınız.

    [WebMethod]
    public System.IO.Stream GetDYFtpWebRequestStream(string firmName, string filePath)
    {
            using(System.IO.Stream newStream = new System.IO.MemoryStream()){
                string ftpAdress = ftpServer + ":" + ftpPort + "/" + ftpFolder + "/" + firmName + "/" + Path.GetFileName(filePath);
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpAdress);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(ftpUser, ftpPass);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = true;
                //Eğer dönüş tipinde hala problem var ise hatayı artık burada almalısınız.
                newStream = (System.IO.Stream)request.GetRequestStream();
                //bu noktaya kesme koyarak verinin dolu geldiğini, VS üzerinden onaylayın.
                return newStream;
            };
    }
    
    
    using (var fs = File.OpenRead(filePath))
    {
            System.IO.Stream ftpStream = null;
            ftpStream = (System.IO.Stream)Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
            fs.CopyTo(ftpStream);
            ftpStream.Close();
            status = "Dosya başarıyla " + ftpAdress + " adresine yüklendi!";
            return status;
    }

    Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz



    11 Aralık 2020 Cuma 08:17
  • Aşağıdaki şekilde deneyebilir misiniz.

    Notları dikkate alınız.

    [WebMethod]
    public System.IO.Stream GetDYFtpWebRequestStream(string firmName, string filePath)
    {
            using(System.IO.Stream newStream = new System.IO.MemoryStream()){
                string ftpAdress = ftpServer + ":" + ftpPort + "/" + ftpFolder + "/" + firmName + "/" + Path.GetFileName(filePath);
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpAdress);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(ftpUser, ftpPass);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = true;
                //Eğer dönüş tipinde hala problem var ise hatayı artık burada almalısınız.
                newStream = (System.IO.Stream)request.GetRequestStream();
                //bu noktaya kesme koyarak verinin dolu geldiğini, VS üzerinden onaylayın.
                return newStream;
            };
    }
    
    
    using (var fs = File.OpenRead(filePath))
    {
            System.IO.Stream ftpStream = null;
            ftpStream = (System.IO.Stream)Licence.LicenceServiceClient.GetDYFtpWebRequestStream(AppSettings.firmCode, filePath);
            fs.CopyTo(ftpStream);
            ftpStream.Close();
            status = "Dosya başarıyla " + ftpAdress + " adresine yüklendi!";
            return status;
    }

    Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz



    Bu şekilde denediğim zaman 

    newStream = (System.IO.Stream)request.GetRequestStream();

    satırında "Cannot assign to newStream because it is a using variable" hatası alıyorum. Using bloğunu kaldırıp normal hale dönüştürdüğüm zaman hata kalktı fakat yine benim uygulamam tarafında aynı hatayı almaya devam ediyorum.

    12 Aralık 2020 Cumartesi 20:46