0

我正在寻找有关我的一个或多个应用程序的客户反馈(可选,他们会收到通知),因此我想发送一些文本以从我的离线 C# Winforms 应用程序附加到在线日志文件中。

如果它有所作为,服务器是基于 Linux 的,我不介意公众是否也可以访问它,所以无需担心加密或任何事情(其中不会存储任何个人详细信息或类似内容)。

做这样的事情需要什么 C# 代码?(假装网站是:http ://www.website.com/logfile.txt )。我是否必须批量读取文件,然后批量写回,还是可以使用更有效的“附加”操作?

编辑:看起来比我想象的要难。如果我必须制作一个简单的 PHP 脚本来帮助完成这项任务,那就这样吧,不过如果是这样的话,我也会很感激代码。

4

3 回答 3

2

你有几个选择。

首先,您可以查看像loggly这样的服务,它是一个在线日志文件。您将拥有一个个人 API 密钥来从您的应用程序中发布数据。

如果您不想这样做,您可以编写自己的 API,其中包含一个带有字符串参数的简单 Post。然后它将负责打开文件、添加文本并保存它。Winform 可能只是触发并忘记,知道 API 可以处理它。

在 C# 中,您可以使用 RestSharp 或 HttpClient 将数据发送到 API。

我认为您将遇到的问题是让 Winform 应用程序保存文件。如果它是本地文件,您可以只附加到文件(无需将整个文件读入内存。)但在远程计算机上,您首先必须下载整个文件。下一个问题是确保 Winform 应用程序可以保存文件。如果没有 API 调用之类的东西,您可能会遇到很多问题。

于 2013-02-24T18:23:06.267 回答
1

这可能不足以满足您的需求,但这是我的解决方案。我能想到的最简单的方法是让您的 C# 应用程序将文本发送到 Web 脚本。既然您说您不在乎数据是否已加密,我想为什么不将文本作为 get 参数传递给 PHP 脚本。这个例子非常简单;您可能需要添加其他检查以满足您的需求:

C# 代码如下所示:

 string loggerUrl = "http://www.YourDomainExample.com/Logger.php?text=";
 string textToLog = WebUtility.UrlEncode("This text came from my C# desktop application");
 HttpWebRequest myWebRequest = (HttpWebRequest)HttpWebRequest.Create(loggerUrl + textToLog);
 HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
 myWebResponse.Close();

驻留在 Web 服务器上的 PHP 脚本如下所示:

<?php

$text = htmlspecialchars($_GET["text"]);

$log = "log.txt";
$fh = fopen($log, 'a') or die("can't open file"); // Open log in append mode
$textToWrite = "$text\n"; //Write each comment on a line
fwrite($fh, $textToWrite);
fclose($fh);

?>

通过这种方式,基本上任何可以调用 url 的东西都可以将文本附加到您的日志中。因此,您的记录器可以是桌面应用程序的一部分,可以在手机或 Web 应用程序等上运行。

要测试您的 PHP 脚本是否正常工作,您可以使用 Web 浏览器作为客户端,然后从 webbrowser 转到http://www.YourDomainExample.com/Logger.php?text=Test并检查您的网络服务器

于 2013-02-24T22:33:40.570 回答
0

如果您想登录到远程目的地,我看到了两种解决方案。两者都使用log4net

解决方案1:

您可以设置log4net登录到数据库。您可以在此处查看配置。

解决方案2:

您可以从中派生您的日志记录类AppenderSkeleton并配置行为以登录您想要的任何内容。

internal class MyAppender : AppenderSkeleton
{
    /// <summary>
    /// Subclasses of <see cref="T:log4net.Appender.AppenderSkeleton"/> should implement this method
    /// to perform actual logging.
    /// </summary>
    /// <param name="loggingEvent">The event to append.</param>
    protected override void Append(LoggingEvent loggingEvent)
    {
        /* Here you can do whatever you want with your loggingEvent */
    }
}
于 2013-02-24T18:54:54.093 回答