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:at System.Uri.Parse(UriKind kind、System.String uriString)[0x00000] in:0 at System.Uri.ParseUri(UriKind kind)[0x00000] in:0 at 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] in:0 at System.Xml.XmlUrlResolver.ResolveUri(System.Uri baseUri、System.String RelativeUri)[0x00000] in:0 at 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 filename) [0x00000] in:0 at BoardiesITSolutions.Config.readConfig(システム。String sectionName、Boolean soapService)[0x00000] in:0

4

1 に答える 1

0

問題を発見しました。なぜこれが問題なのかわかりません。Windows では正常に動作するため、Mono のバグに違いないと推測しています。

次のコードは 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 に答える