如何在web.config不可用时解析对applicationSettings的引用

时间:2009-08-05 11:30:13

标签: c# visual-studio web-config asmx class-design

我正在尝试将代码放在.ASMX Web服务中并将其更改为类库项目。 Web服务项目有一个web.config文件:

<applicationSettings>
    <myService.Properties.Settings>
        <setting name="DownloadChunkSize" serializeAs="String">
            <value>100000</value>
        </setting>

..并且FileService.asmx.cs文件中的代码使用它来检索值:

int chunkSize = (int)Properties.Settings.Default.DownloadChunkSize;

当我尝试重新设计此代码以消除.asmx Web服务时,我的类库项目中出现编译时错误,因为不再有web.config可用。让我试着解释一下我到目前为止所做的事情(以及为什么):

这样做的动机是简化我的项目。也就是说,我有一个带有.asmx项目的Vstudio解决方案。它有一些方法,并封装了与供应商提供的另一个.asmx Web服务的通信。

我尝试的新设计如下:

Project 1是一个名为ProxyASMX的类库项目,带有对供应商Web服务的Web引用。我这里没有提供代码;它只是一个指向供应商Web服务的小app.config。

Project 2是一个类库项目,它引用了ProxyASMX.dll。此FileService.cs文件中的代码与我的原始Web服务相同,但[webmethod]属性已被删除。这是我编译时遇到的项目。

Project 3是一个带有2个HTTPHandler的Web应用程序项目 - Upload.ashx和Download.ashx。该项目将引用Project 2类库。我尝试用原始解决方案中更全面的web.config内容替换小的默认web.config内容,但是当这不起作用时,我想我最好向专家咨询一下这个冒险。

我希望上面的草图很清楚。我认为这应该是非常可行但现在我不太确定。

3 个答案:

答案 0 :(得分:5)

您可以将应用程序设置添加到类库中。因此,您在“使用它们”的项目中添加“应用程序设置”。然后,您只需将这些配置部分复制到“项目堆栈”中。

因此,如果我理解你是正确的,你需要将DownloadChunkSize设置添加到Project 2并将此部分复制到Project 3中的web.config。这将是:

<applicationSettings>
    <Project2.Properties.Settings>
        <setting name="DownloadChunkSize" serializeAs="String">
            <value>100000</value>
        </setting>

您可以使用以下方式访问Project 3中的此设置:

Project2.Properties.Settings.Default.DownloadChunckSize

在项目2中:

Properties.Settings.Default.DownloadChunckSize

答案 1 :(得分:0)

我认为您需要创建一个ExeConfigurationFileMap并使用它从Project 1中的App.config中检索值。

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();

        fileMap.ExeConfigFilename = @"ConfigTest.exe.config";  // relative path names possible

        // Open another config file 

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);



        // read/write from it as usual

        ConfigurationSection mySection = config.GetSection("mySection");

        config.SectionGroups.Clear(); // make changes to it 

        config.Save(ConfigurationSaveMode.Full);  // Save changes

企业图书馆有一个很好的帮助,就是这种东西 - 汤姆霍兰德做得很好writeup

答案 2 :(得分:0)

如果可能的话,我倾向于避免使用库的配置文件。我将这个作为您从库中公开的类的属性,并让应用程序确定设置的存储方式和位置。

如果有多个应用程序重用库,我更可能会考虑库级配置文件(例如NLog)。但在大多数情况下,设置更有意义来自应用程序。