我正在开发一个需要在Windows和Linux(Mono)上运行的c#项目,它在启动时会从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 kind,System.String uriString)[0x00000] in:System.Uri.ParseUri中的0 (UriKind类型)[0x00000] in:System.Uri..ctor中的0 (System.String uriString,Boolean dontEscape)[0x00000] in:0 at System.Uri..ctor(System.String uriString)[0x00000] in:0在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 在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 :BoardiesITSolutions.Config.readConfig为0 (System.String sectionName,Boolean soapService)[0x00000] in :0
答案 0 :(得分:0)
我发现了问题,我不明白为什么这是问题我猜它一定是Mono中的一个bug,因为它在Windows中工作正常。
即使以下代码在Windows中由于某种原因在Mono中正常工作,它也会抛出该异常,即使它确实获得了正确的路径。如果我删除该代码并将configPath更改为"config.xml"
,那么它可以正常工作。
string applicationPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
configPath = Path.Combine(applicationPath, "config.xml");