0

我正在研究需要在 Windows 和 Linux (Mono) 上运行的 ac# 项目,当它启动时它会从 xml 配置文件中读取一些设置。在 Windows 上这工作正常,但在 Linux 上却出错了。它抛出一个异常,说它有一个无效的 URI,但这不可能是正确的,因为它在 Windows 上工作正常。

我想这可能是由于文件在传输过程中以某种方式损坏,所以我删除了配置文件并手动重新键入它,但它仍然出现相同的错误。

下面是在配置文件中读取的代码

public Dictionary<string, string> readConfig(string sectionName, bool soapService=false)
        {
            Dictionary<string, string> config = new Dictionary<string, string>();
            try
            {
                XmlDocument configXml = new XmlDocument();
                string configPath = "";
                if (soapService)
                {
                    string applicationPath = HttpContext.Current.Server.MapPath(null);
                    configPath = Path.Combine(applicationPath, "config.xml");
                }
                else
                {
                    string applicationPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
                    configPath = Path.Combine(applicationPath, "config.xml");
                }
                configXml.Load(configPath);
                XmlNodeList options = configXml.SelectNodes(string.Format("/options/{0}", sectionName));
                XmlNodeList parameters = configXml.GetElementsByTagName("item");
                foreach (XmlNode option in options)
                {
                    foreach (XmlNode setting in option)
                    {
                        string key = setting.Attributes["key"].Value;
                        string value = setting.Attributes["value"].Value;

                        config.Add(key, value);
                    }
                }
            }
            catch (KeyNotFoundException ex)
            {
                Console.WriteLine("Config KeyNotFoundException: {0}", ex.Message);
            }
            catch (XmlException ex)
            {
                Console.WriteLine("Config XmlException: {0}", ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Config Exception: {0}", ex.Message);
            }
            return config;
        }

完整的例外是Config Exception: Invalid URI: The Authority/Host could not be parsed

下面是config.xml

<?xml version="1.0" encoding="utf-8" ?>
<options>
  <database>
    <item key="server" value="localhost" />
    <item key="database" value="emailserver" />
    <item key="username" value="myusername" />
    <item key="password" value="mypassword" />
    <item key="port" value="3306" />
    <item key="logFile" value="email_server.txt" />
  </database>
  <EmailServer>
    <item key="ip_address" value="127.0.0.1" />
    <item key="port" value="12345" />
  </EmailServer>
  <SmtpServer>
    <item key="ip_address" value="127.0.0.1" />
    <item key="port" value="25" />
  </SmtpServer>
  <SendMailSettings>
    <item key="smtp_server" value="smtp.gmail.com" />
    <item key="smtp_port" value="587" />
    <item key="smtp_useSSL" value="true" />
    <item key="smtp_username" value="myusername" />
    <item key="smtp_password" value="mypassword" />
    <item key="smtp_useAuthentication" value="true" />
  </SendMailSettings>
</options>

我不明白为什么它会显示此错误。

感谢您的任何帮助,您可以提供。

更新 下面是要求的堆栈跟踪

StackTrace:在 System.Uri.Parse(UriKind 种类,System.String uriString)[0x00000] 在:0 在 System.Uri.ParseUri(UriKind 种类)[0x00000] 在:0 在 System.Uri..ctor(System.String uriString, Boolean dontEscape) [0x00000] in :0 at System.Uri..ctor (System.String uriString) [0x00000] in :0 at System.Xml.XmlResolver.ResolveUri (System.Uri baseUri, System.String relativeUri) [ 0x00000] 在:0 在 System.Xml.XmlUrlResolver.ResolveUri (System.Uri baseUri,System.String relativeUri) [0x00000] 在:0 在 Mono.Xml2.XmlTextReader..ctor (System.String url,System.Xml.XmlNameTable nt) [0x00000] in :0 at System.Xml.XmlTextReader..ctor (System.String url, System.Xml.XmlNameTable nt) [0x00000] in :0 at System.Xml.XmlDocument.Load (System.String 文件名) [0x00000] 在 BoardiesITSolutions.Config.readConfig (系统。String sectionName, Boolean soapService) [0x00000] in :0

4

1 回答 1

0

我发现了问题,我不明白为什么这是问题,我猜它一定是 Mono 中的错误,因为它在 Windows 中运行良好。

即使以下代码在 Windows 中由于某种原因在 Mono 中运行良好,它也会抛出该异常,即使它确实获得了正确的路径。如果我删除该代码并将 configPath 更改为,"config.xml"那么它可以正常工作。

string applicationPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
configPath = Path.Combine(applicationPath, "config.xml");
于 2012-07-22T15:10:22.577 回答