0

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

2 回答 2

1

您需要完全限定 tax.xml 的路径。类似 c:\somefolder\anotherfolder\taxes.xml

于 2013-08-10T21:50:01.983 回答
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")
                       };
于 2013-08-11T13:35:13.007 回答