2

ZebraDesigner for xml ver2.0 を使用して、Zebra 170PAX4 プリンター用のラベル テンプレートをいくつか作成しました。zpl を Zebra に正常にエクスポートしました。次のように、Windows コマンド プロンプトで ftp を使用して、xml ファイルを編集し、Zebra に送信できます。c:\ftp 10.161.41.212 Connected to 10.161.41.212. 220 ZBR-46688 Version 1.01.7 ready. User (10.161.41.212:(none)): 230 User logged in. ftp> put c:SPver1_1.xml 200 PORT command successful. 150 Opening ASCII mode data connection for SPver1_1.xml. 226 Transfer complete. ftp: 324 bytes sent in 0.00Seconds 324000.00Kbytes/sec

現在、MS VS2010 と C# を使用して、WinForms アプリケーションからこれを自動的に実行しようとしています。しかし、何らかの理由で、FtpWebRequest クラスを使用しようとしているようには見えず、エラーも表示されます

リモート サーバーがエラーを返しました: (502) コマンドが実装されていません。

私が理解していることから、ftp メソッド UploadFile は STOR と同じであり、エイリアスが置かれているのと同じです。私が使用しているコードを以下に示します。

public bool PutXmlFile(CZebraPrinter printer, CDeviceContainer devices)
    {
        bool OK = true;
        CDevice currDevice = new CDevice();
        currDevice = devices.GetDevice(this.m_devName);
        string ftpHost = "ftp://" + printer.m_IPAddress + "/";
        string ftpPath = "E:";
        Uri printerUri = new Uri(ftpHost + ftpPath);

        try
        {
            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(printerUri);
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            ftpRequest.KeepAlive = false;
            ftpRequest.UseBinary = false;
            ftpRequest.UsePassive = false;
            ftpRequest.Timeout = 5000;  //milliseconds

            // The Zebra printer uses anonymous login
            ftpRequest.Credentials = new NetworkCredential("anonymous", "");

            // Copy the contents of the file to the request stream.
            StreamReader sourceStream = new StreamReader(currDevice.m_defaultDataFile);
            byte[] fileContents = Encoding.ASCII.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();

            Stream requestStream = ftpRequest.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
            //Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
            //Check response
            response.Close();
        }
        catch (Exception ex)
        {
            string errMessage = string.Format("An error occured trying to ftp the device xml file to the Zebra printer.  \n\nReason:\n{0}", ex.Message);
            MessageBox.Show(errMessage, m_mfgInfoErr, MessageBoxButtons.OK, MessageBoxIcon.Error);
            return !OK;
        }
        return OK;
    }

私が間違っているかもしれないことを誰かが見ていますか?どんなアイデアでも大歓迎です。ありがとう。

TRACE を実行しました。出力は次のとおりです。

System.Net Information: 0 : [4780] FtpWebRequest#14993092::.ctor(ftp://10.161.41.212/E:)
System.Net Verbose: 0 : [4780] Exiting WebRequest::Create()     -> FtpWebRequest#14993092
System.Net Verbose: 0 : [4780] FtpWebRequest#14993092::GetRequestStream()
System.Net Information: 0 : [4780] FtpWebRequest#14993092::GetRequestStream(Method=STOR.)
System.Net Information: 0 : [4780] Associating FtpWebRequest#14993092 with FtpControlStream#720107
System.Net Information: 0 : [4780] FtpControlStream#720107 - Received response [220 ZBR-46688 Version 1.01.7 ready.]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Sending command [USER anonymous]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Received response [230 User logged in.]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Sending command [OPTS utf8 on]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Received response [502 Command 'OPTS' not implemented.]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Sending command [PWD]
System.Net Information: 0 : [4780] FtpControlStream#720107 - Received response [502 Command 'PWD' not implemented.]
System.Net Information: 0 : [4780] FtpWebRequest#14993092::(Releasing FTP connection#720107.)
System.Net Error: 0 : [4780] Exception in the FtpWebRequest#14993092::GetRequestStream - The remote server returned an error: (502) Command not implemented.

したがって、OPTSPWDが問題のようです。FtpWebRequest によって送信されるものを制御する方法はありますか、またはサードパーティのライブラリが必要ですか?

4

3 に答える 3

1

UploadFile は STOR コマンドを使用しますが、このコマンドが送信される前に、.NET は "OPTS utf8 on" や "TYPE I" などの他のコマンドを送信することがあります。次の内容でアプリケーションの構成ファイルを作成する場合:

<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <sharedListeners>
      <add name="console" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\logfile.txt" />
    </sharedListeners>
    <sources>
      <source name="System.Net" switchName="sourceSwitch">
        <listeners>
          <add name="console" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="sourceSwitch" value="Verbose"/>
    </switches>
  </system.diagnostics>
</configuration>

すべてのコマンドと応答がファイルに記録されるため、どれが問題を引き起こしているかを確認できます。

更新: 問題は、STOR コマンドが発行される前に、FTP クライアントが OPTS および PWD コマンドを送信することです。おそらく、非常に軽量な FTP サーバーであるため、プリンターはこれらを理解できません。残念ながら、これらのコマンドが送信されないようにする方法がわかりません。私が考えている回避策は2つだけです。

  • これらの問題のあるコマンドを送信しないサードパーティの FTP ライブラリを見つけてください。
  • コマンド ラインからのファイルのアップロードが機能するため、適切な「put」コマンドでファイル (commands.txt) を作成し、次のようにプログラムから FTP 転送を開始します。

Process.Start("ftp", "-A -s:commands.txt " + printer.m_IPAddress);

于 2012-04-18T18:39:35.823 に答える