0

我正在尝试使用 webconfig 的调试和发布版本,但它从不工作。我正在尝试为我使用的名为combres 的第3 方库执行此操作。

http://combres.codeplex.com/

所以我首先将所有需要的 web.config 代码放在 web.config 中。现在我有 2 个不同的 .xml 文件(那是你放置 javascript 和 css 路径的地方)。

因此生产将具有不同的 .xml 路径,因此将进行调试。

所以我把这一行移到了web.config的release和debug中,修改了xml文件的路径。

    // release webconfig
    <combres definitionUrl="~/App_Data/Combres.xml" />

   // debug webconfig
   <combres definitionUrl="~/App_Data/CombresDevelopment.xml" />

我明白了

System.UnauthorizedAccessException was unhandled by user code
  Message=Access to the path 'E: test.com' is denied.
  Source=mscorlib
  StackTrace:
       at 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, Boolean useLongPath)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
       at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
       at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
       at System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext)
       at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext)
       at System.Xml.Linq.XDocument.Load(String uri, LoadOptions options)
       at System.Xml.Linq.XDocument.Load(String uri)
       at Combres.ConfigReader.ReadCombresUrl(String filePath)
       at Combres.Configuration.GetCombresUrl()
       at Combres.WebExtensions.AddCombresRoute(RouteCollection routes, String name)
       at MyApp.MvcApplication.RegisterRoutes(RouteCollection routes) in E:\Global.asax.cs:line 19
       at MyApp3.MvcApplication.Application_Start() in E:\Global.asax.cs:line 46
  InnerException: 

第 19 行 -> routes.AddCombresRoute("Combres");

第 46 行 -> RegisterRoutes(RouteTable.Routes);

所以我不明白为什么我会收到这个错误。我认为 webconfig jsut 是动态合并的,那么为什么它会在顶层而不是 .debug 上运行。

编辑

这是我的文件(出于安全考虑,删除了一些信息)

网页配置

    <configSections>
        <section name="combres" type="Combres.ConfigSectionSetting, Combres, Version=2.0.0.0, Culture=neutral, PublicKeyToken=49212d24adfbe4b4"/>
        <sectionGroup name="elmah">
            <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
            <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
            <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
            <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
            <section name="errorTweet" requirePermission="false" type="Elmah.ErrorTweetSectionHandler, Elmah"/>
        </sectionGroup>
    </configSections>

    <appSettings>....</appSettings>


    <!--<combres definitionUrl="~/App_Data/Combres.xml" />-->
    <!--<combres definitionUrl="~/App_Data/CombresDevelopment.xml" />-->

    <connectionStrings>....</connectionStrings>



    <elmah>
        <errorLog type="Elmah.SqlErrorLog, Elmah" logPath="~/App_Data" connectionStringName="...." />
        <errorFilter>
            <test>
                <equal binding="HttpStatusCode" value="404" type="Int32" />
            </test>
        </errorFilter>
        <security allowRemoteAccess="0" />
    </elmah>

    <system.web>
    <globalization culture="en" uiCulture="en-US" />
    <httpRuntime requestValidationMode="2.0"/>

    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>

    <authentication mode="Forms">
    </authentication>

    <pages>
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="CustomHtmlHelpers" />
        <add namespace="Combres.Mvc" />
      </namespaces>
    </pages>

      <httpHandlers>
          <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
      </httpHandlers>

      <httpModules>
          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
          <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
      </httpModules>

  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

正如您现在所看到的,我已将我的梳子注释掉,因为现在我必须手动来回切换。

这是我的 web.debug.config

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <combres definitionUrl="~/App_Data/CombresDevelopment.xml"  xdt:Transform="Inserting"/>
    <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an atrribute "name" that has a value of "MyDB".

    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->

  <system.web>        
      <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>
4

3 回答 3

2

The way i understood it is that it does not merge, but transforms the web.config using a new syntax. There should be some comments in the release and debug configs with regards how to do this.

//In the example below, the "SetAttributes" transform will change the value of 
//"connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
//finds an atrribute "name" that has a value of "MyDB".

<connectionStrings>
  <add name="MyDB" 
    connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
    xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>

As it says, this transform will replace the connection string, but im sure you could use it to transform and replace any other part of the web.config.


Try in your web.release.config

   <combres definitionUrl="~/App_Data/Combres.xml" xdt:Transform="SetAttributes"/>

And

web.debug.config

   <combres definitionUrl="~/App_Data/CombresDevelopment.xml" xdt:Transform="SetAttributes"/> 

I think your issue is with not using the transforms correctly, you can read this link for more information. http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx

于 2010-06-28T12:48:20.817 回答
1

似乎不是 web.config 问题。

该错误是关于无法访问'E: test.com' 路径的。

检查此文件的权限,错误应该消失,或发现真正的错误。

问候

于 2010-07-01T14:04:02.780 回答
0

我希望你一定已经检查过了。但以防万一...

右键单击 APP_DATA 文件夹。在“属性”中的“安全”选项卡下检查运行 IIS 的登录名是否具有对 APP_DATA 文件夹的适当权限。

于 2010-06-28T12:41:41.040 回答