我正在用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(十进制数,int年)。 这个类在我从我的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) at 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) 在System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize) 在System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials凭据) 在System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,String role,Type ofObjectToReturn) 在System.Xml.XmlReader.Create(String inputUri,XmlReaderSettings设置,XmlParserContext inputContext) 在System.Xml.XmlReader.Create(String inputUri,XmlReaderSettings设置) 在System.Xml.Linq.XElement.Load(String uri,LoadOptions选项) 在System.Xml.Linq.XElement.Load(String uri) 在AtYourServiceSoftware.LB.GetTaxAmount(十进制金额,Int32年) at sxm3.Service1.GetTaxAmountx(Decimal amount,Int32 year)在C:\ Documents and Settings \ user \ My Documents \ Visual Studio 2008 \ Projects \ sxm3 \ sxm3 \ Service1.asmx.cs:第29行
希望有人知道答案,提前谢谢。 Joost
哦,顺便说一句,我希望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")
};
答案 0 :(得分:1)
您需要完全限定tax.xml的路径。比如c:\ somefolder \ anotherfolder \ taxes.xml
答案 1 :(得分:0)
这是有效的: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")
};