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 文件的主要内容,如果未能解决你的问题,请参考以下文章

C#程序访问底层网络

C# winform 如何引用webservices

如何在没有任何app.config的情况下访问dll中webservice的Web方法?

为啥我发布的webservice改变端口号后无法访问

将 C++ DLL 添加到 C# 项目

C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员