C# webservice 引用 dll 无法访问外部 xml 文件
Posted
技术标签:
【中文标题】C# webservice 引用 dll 无法访问外部 xml 文件【英文标题】:C# webservice referencing dll cannot access external xml file 【发布时间】:2013-08-12 11:10:36 【问题描述】:我正在用 C# 构建一个 Web 服务。 在这个网络服务上,我有以下代码:
public class Service1 : System.Web.Services.WebService
[WebMethod]
public decimal GetTaxAmountx(decimal amount, int year)
decimal result;
result = LB.GetTaxAmount(amount, year);
return result;
LB 是一个静态类,提供静态方法 GetTaxAmount(decimal amount, int year)。 此类位于我从 Web 服务引用的 dll 中。 LB.GetTaxAmount 方法使用 linq to xml 来加载一些数据,像这样:
var name = from nm in XElement.Load("Taxes.xml").Elements("Year").Elements("Scale")
where nm.Parent.Attribute("id").Value == year.ToString()
&& (decimal)nm.Element("MoreThan") <= amount
&& (decimal)nm.Element("NotMoreThan") >= amount
select new
TaxAmount = nm.Element("TaxAmount"),
Percentage = nm.Element("Percentage"),
MoreThan = nm.Element("MoreThan")
;
最后 LB.GetTaxAmount 返回一个小数。
当通过引用普通香草类中的代码中的 dll 来测试对 LB.GetTaxAmount 的调用时,一切正常。 但是当我通过输入参数并单击 INVOKE 按钮来测试 Web 服务时,它找到了 dll,但找不到我放在与 ddl 文件相同的文件夹中的 XMl 文件。我收到以下错误消息:
System.IO.FileNotFoundException:找不到文件“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Taxes.xml”。 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) 在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy) 在 System.IO.FileStream..ctor(字符串路径、FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize) 在 System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials 凭据) 在 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,字符串角色,ObjectToReturn 类型) 在 System.Xml.XmlReader.Create(字符串 inputUri,XmlReaderSettings 设置,XmlParserContext inputContext) 在 System.Xml.XmlReader.Create(字符串 inputUri,XmlReaderSettings 设置) 在 System.Xml.Linq.XElement.Load(字符串 uri,LoadOptions 选项) 在 System.Xml.Linq.XElement.Load(字符串 uri) 在 AtYourServiceSoftware.LB.GetTaxAmount(十进制金额,Int32 年) 在 C:\Documents and Settings\user\My Documents\Visual Studio 2008\Projects\sxm3\sxm3\Service1.asmx.cs:line 29 中的 sxm3.Service1.GetTaxAmountx(十进制金额,Int32 年)
希望有人知道答案,在此先感谢。约斯特
哦,顺便说一句,我希望 xml 是外部的,而不是嵌入的,所以我的客户可以不时更新它(客户就是付钱给我的人)。
更新:感谢 Mike 和 Kyle 以及这篇文章:http://www.***.com/a/283917/243557
我改成:
static public string AssemblyDirectory
get
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
public static decimal GetTaxAmount(decimal amount, int year)
var name = from nm in XElement.Load(AssemblyDirectory + @"\Taxes.xml").Elements("Year").Elements("Scale")
where nm.Parent.Attribute("id").Value == year.ToString()
&& (decimal)nm.Element("MoreThan") <= amount
&& (decimal)nm.Element("NotMoreThan") >= amount
select new
TaxAmount = nm.Element("TaxAmount"),
Percentage = nm.Element("Percentage"),
MoreThan = nm.Element("MoreThan")
;
【问题讨论】:
你还能继续吗?因为 .net 可能会在内部处理框架中的异常。你不能对这些异常做任何事情,只能忽略它们。如果禁用第一次更改异常怎么办?您的计划是否继续? 感谢您的回答。我不确定你的意思,迈克。我是 C# 和整个 .net 环境的相对菜鸟。但不管怎样,我能不能继续不是真正的问题。该例程需要外部 XML 文件中的数据进行一些计算并返回结果。 阅读第一次机会例外。当您刚开始使用 C# 编程时,我非常怀疑您自己在应用程序中使用了文件C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Taxes.xml
。哦,我现在明白了。您只添加了名称,而不是像 Kyle
回答的整个路径。
谢谢,我学到了一些新东西,我在原来的问题中发布了解决方案。
【参考方案1】:
您需要完全限定 tax.xml 的路径。类似 c:\somefolder\anotherfolder\taxes.xml
【讨论】:
谢谢凯尔,这确实是问题所在,尽管在没有硬编码的情况下获得完全合格的路径需要付出一些努力。我在原始问题中发布了解决方案。 哎呀,这些菜鸟,嗯? ;-) 完成【参考方案2】:这是有效的:XML 文件与正在执行的 dll 位于同一文件夹中。首先获取执行程序集的完全限定路径并将其传递给 XElement.Load()
static public string AssemblyDirectory
get
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
public static decimal GetTaxAmount(decimal amount, int year)
var name = from nm in XElement.Load(AssemblyDirectory + @"\Taxes.xml").Elements("Year").Elements("Scale")
where nm.Parent.Attribute("id").Value == year.ToString()
&& (decimal)nm.Element("MoreThan") <= amount
&& (decimal)nm.Element("NotMoreThan") >= amount
select new
TaxAmount = nm.Element("TaxAmount"),
Percentage = nm.Element("Percentage"),
MoreThan = nm.Element("MoreThan")
;
【讨论】:
以上是关于C# webservice 引用 dll 无法访问外部 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章