C#webservice引用dll无法访问外部xml文件

时间:2013-08-10 18:19:39

标签: c# xml dll external

我正在用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")
                           };

2 个答案:

答案 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")
                       };