繁体   English   中英

从Windows Phone 8在FTP服务器上上传文件时引发异常

[英]Exception thrown while uploading file on FTP server from Windows Phone 8

我想在FTP服务器上上传视频文件,我的所有搜索结果都以MSDN managzine文章“ 在Windows Phone 8中添加FTP支持”结束。 它有很棒的示例和库。 我尝试了2个FTP URL,一个是Mozilla存储库,另一个是我的机密URL。 什么都没有为我工作,但抛出异常。 我在名为File Downloader的应用程序中尝试了FTP URL,它可以正常工作。 期望详细信息和输出窗口日志如下。

因此,任何人都可以建议我在该库中进行哪些更改? 是否有另一个可用的工作库或其他任何方式将文件上传到FTP?

Exception is thrown in file FtpClient.cs, event FtpClientSocket_DataReceived(...), at line "await PrepareDataChannelAsync(Response);" [Line # 253]

ftp.mozilla.org

System.Exception: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. (Exception from HRESULT: 0x8007274C)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at WinPhoneFtp.FtpService.FtpClient.<PrepareDataChannelAsync>d__2b.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at WinPhoneFtp.FtpService.FtpClient.<FtpClientSocket_DataReceived>d__3.MoveNext()

Output log

FTP Server IP Address: ftp.mozilla.org with port 21
FTP Command Channel Initailized
FTPServer -> 220-
220-   ftp.mozilla.org / archive.mozilla.org - files are in /pub/mozilla.org
220-
220-   Notice: This server is the only place to obtain nightly builds and needs to
220-   remain available to developers and testers. High bandwidth servers that
220-   contain the public release files are available at ftp://releases.mozilla.org/
220-   If you need to link to a public release, please link to the release server,
220-   not here. Thanks!
220-
220-   Attempts to download high traffic release files f
FTPServer -> rom this server will get a
220-   "550 Permission denied." response.
220 
FTPClient -> USER anonymous
FTPServer -> 331 Please specify the password.
FTPClient -> PASS m@m.com
FTPServer -> 230-
230-   ftp.mozilla.org / archive.mozilla.org - files are in /pub/mozilla.org
230-
230-   Notice: This server is the only place to obtain nightly builds and needs to
230-   remain available to developers and testers. High bandwidth servers that
230-   contain the public release files are available at ftp://releases.mozilla.org/
230-   If you need to link to a public release, please link to the release server,
230-   not here. Thanks!
230-
230-   Attempts to download high traffic release files f
FTPClient -> PWD
FTPServer -> rom this server will get a
230-   "550 Permission denied." response.
230 Login successful.
FTPClient -> PASV
FTPServer -> 257 "/"
FTPServer -> 227 Entered Passive Mode (63,245,215,46,199,76)
FTP Data Channel IPAddress: 63.245.215.46, Port: 50951
A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll
An exception of type 'System.Exception' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary
A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll

========================================================================================================================

Confidential FTP URL which required authentication

System.Exception: No connection could be made because the target machine actively refused it. (Exception from HRESULT: 0x8007274D)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at WinPhoneFtp.FtpService.FtpClient.<PrepareDataChannelAsync>d__2b.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at WinPhoneFtp.FtpService.FtpClient.<FtpClientSocket_DataReceived>d__3.MoveNext()

Output log

FTP Server IP Address: --CONFIDENTIAL-- with port 21
FTP Command Channel Initailized
FTPServer -> 220 (vsFTPd 2.0.5)
FTPClient -> USER --CONFIDENTIAL--
FTPServer -> 331 Please specify the password.
FTPClient -> PASS --CONFIDENTIAL--
FTPServer -> 230 Login successful.
FTPClient -> PWD
FTPClient -> PASV
FTPServer -> 257 "/"
FTPServer -> 227 Entering Passive Mode (173,193,219,177,156,29)
FTP Data Channel IPAddress: 173.193.219.177, Port: 39938
A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll
An exception of type 'System.Exception' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary
A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll

我还尝试了下面给出的代码,该代码可在Windows 8上使用,但不适用于Windows Phone 8

var ftpURL = "ftp://ftp.url.com";
var request = WebRequest.Create(ftpURL + "/" + file_name.ext);
request.Credentials = new NetworkCredential("uname", "pwd");
request.Method = "STOR";

byte[] fileBytes = null;
using (var stream = await objStorageFile.OpenReadAsync())
{
    fileBytes = new byte[stream.Size];
    using (var reader = new DataReader(stream))
    {
        await reader.LoadAsync((uint)stream.Size);
        reader.ReadBytes(fileBytes);
    }
}

var requestStream = request.BeginGetRequestStream(async a =>
{
    var requestStreamEnd = request.EndGetRequestStream(a);
    await requestStreamEnd.WriteAsync(fileBytes, 0, fileBytes.Length);
    await requestStreamEnd.FlushAsync();
}, request);

var respo = request.BeginGetResponse(b =>
{
    var res = request.EndGetResponse(b);
    var aa = res.Headers;
}, null);

用以下方法替换FtpClient类方法中的PrepareDataChannelAsync(String channelInfo):

private async Task PrepareDataChannelAsync(String channelInfo)
    {
        channelInfo = channelInfo.Remove(0, "227 Entering Passive Mode".Length);
        int start = channelInfo.IndexOf("(") + 1;
        int length = channelInfo.IndexOf(")") - start;
        channelInfo = channelInfo.Substring(start, length);

        String[] Splits = channelInfo.Split(new char[] { ',', ' ', }, StringSplitOptions.RemoveEmptyEntries);
        String Ipaddr = String.Join(".", Splits, 0, 4);

        //Configure the IP Address
        //Calculate the Data Port
        Int32 port = Convert.ToInt32(Splits[4]);
        port = (port * 256) + Convert.ToInt32(Splits[5]);
        logger.AddLog(String.Format("FTP Data Channel IPAddress: {0}, Port: {1}", Ipaddr, port));
        FtpDataChannel = new StreamSocket();
        await FtpDataChannel.ConnectAsync(new Windows.Networking.HostName(Ipaddr), port.ToString());
        logger.AddLog("FTP Data Channel connected");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM