草庐IT

c# - 从 WinService 上传 FTP 失败

coder 2024-06-06 原文

我制作了一个小型测试应用程序 (WinForms C#) 来测试 FTP 上传。这非常有效。

我尝试在我当前正在处理的 Windows 服务中使用完全相同的方法,但我得到“(426) 连接已关闭;传输中止。'-消息。

我已经多次确认该方法的参数完全相同。他们是!接下来想到的是我的服务运行的帐户,但我已经尝试了所有可能性,甚至以“用户”身份运行服务,提供我自己的凭据。那么它应该像 WinForms 应用程序一样运行,对吗?不,它没有!

它一直运行良好,直到 using (var requestStream = request.GetRequestStream()) 行出现故障。

有问题的 FTP 服务器只允许事件连接,因此 request.UsePassive 设置为 false。

有人知道吗?

       public void UploadToFtp(string url, string filePath, string username, string password, bool mode)
    {
        var fileName = Path.GetFileName(filePath);
        var request = (FtpWebRequest)WebRequest.Create(url + fileName);

        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(username, password);
        request.UsePassive = !mode;
        request.UseBinary = true;
        request.KeepAlive = false;

        using (var fileStream = File.OpenRead(filePath))
        {
            using (var requestStream = request.GetRequestStream())
            {
                fileStream.CopyTo(requestStream);
                requestStream.Close();
            }
        }

        var response = (FtpWebResponse)request.GetResponse();
        response.Close();
    }

添加两种场景的跟踪日志:

使用 Windows 应用程序:

 WebRequest::Create(ftp://someurl/somefile.txt)
 FtpWebRequest#63289421::.ctor(ftp://someurl/somefile.txt)
 Exiting WebRequest::Create()   -> FtpWebRequest#63289421
 Current OS installation type is 'Client'.
 RAS supported: True
 ServicePoint#14173886::ServicePoint(someurl:21)
 FtpWebRequest#63289421::GetRequestStream()
 FtpWebRequest#63289421::GetRequestStream(Method=STOR.)
 FtpControlStream#22525719 - Created connection from 10.10.10.103:1865 to nnn.nnn.nnn.nnn:21.
 Associating FtpWebRequest#63289421 with FtpControlStream#22525719
 FtpControlStream#22525719 - Received response [xxxx
   someurl>PROD server
   Port21>Use active mode> 
   xxxx]
 Sending command [USER myusername]
 Received response [331 Enter password]
 Sending command [PASS ********]
 Received response [230-User logged in
 Hi,I'am datagear PROD.
 230 User logged in]
 Sending command [OPTS utf8 on]
 Received response [200 Command OPTS succeed]
 Sending command [PWD]
 Received response [257 "/CitData" is current directory]
 Sending command [TYPE I]
 Received response [200 Transfer mode set to BINARY]
 Sending command [PORT 10,10,10,103,7,74]
 Received response [200 Command PORT succeed]
 Sending command [STOR somefile.txt]
 Received response [150 Uploading in BINARY file somefile.txt]
 Exiting FtpWebRequest#63289421::GetRequestStream() 
 Received response [226 Transfer completed]
 Sending command [QUIT]
 Received response [221-bye
 Bye-Bye,see you again.

使用 Windows 服务:

 WebRequest::Create(ftp://someurl/somefile.txt)
 FtpWebRequest#63289421::.ctor(ftp://someurl/somefile.txt)
 Exiting WebRequest::Create()   -> FtpWebRequest#25425822
 Current OS installation type is 'Client'.
 ServicePoint#31665793::ServicePoint(someurl:21)
 FtpWebRequest#25425822::GetRequestStream()
 FtpWebRequest#25425822::GetRequestStream(Method=STOR.)
 FtpControlStream#51484875 - Created connection from 10.10.10.103:1759 to nnn.nnn.nnn.nnn:21.
 Associating FtpWebRequest#25425822 with FtpControlStream#51484875
 FtpControlStream#51484875 - Received response [xxxx
   someurl>PROD server
   Port21>Use active mode> 
   xxxx]
 Sending command [USER myusername]
 Received response [331 Enter password]
 Sending command [PASS ********]
 Received response [230-User logged in
 Hi,I'am datagear PROD.
 230 User logged in]
 Sending command [OPTS utf8 on]
 Received response [200 Command OPTS succeed]
 Sending command [PWD]
 Received response [257 "/CitData" is current directory]
 Sending command [TYPE I]
 Received response [200 Transfer mode set to BINARY]
 Sending command [PORT 10,10,10,103,6,224]
 Received response [200 Command PORT succeed]
 Sending command [STOR somefile.txt]
 Received response [426 Transfer failed]
 (Releasing FTP connection#51484875.)
 GetRequestStream - The remote server returned an error: (426) Connection closed; transfer aborted..
   at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   at System.Net.CommandStream.Dispose(Boolean disposing)
   at System.IO.Stream.Close()
   at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
   at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
   at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
   at System.Net.FtpWebRequest.GetRequestStream()
 Exiting FtpWebRequest#25425822::GetRequestStream()  

有效的有一行内容为“RAS Supported”。也许有趣,不知道。

最佳答案

Windows 防火墙导致了问题。从 WinService 运行时,我必须为此服务打开防火墙。当从 VS 环境运行时,防火墙似乎已经为 VS 打开(尽管 WinFirewall 中的直通应用程序列表没有显示)因此一切似乎都运行良好。

关于c# - 从 WinService 上传 FTP 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340611/

有关c# - 从 WinService 上传 FTP 失败的更多相关文章

  1. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

随机推荐