我正在用 C# 构建一个 Web 服务。在此 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 errorCode, String maybeFullPath) 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs , String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) at System。 Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) 在 System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext) 在 System.
希望有人知道答案,提前谢谢。约斯特
哦,顺便说一句,我希望 xml 是外部的而不是嵌入的,因此我的客户可以不时更新它(客户就像付钱给我的人一样)。
更新:感谢 Mike 和 Kyle 以及这篇文章: http: //www.stackoverflow.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")
};