Исключение при указании defaultProxy в app.config при запуске приложения NET4.0 из сетевого ресурса

Мы видим очень странную проблему при запуске следующего приложения из сетевого ресурса в NET4.0. При указании раздела defaultProxy в app.config выдается System.Net.WebException. Нет проблем при запуске с локального диска.

В соответствии с документацией приложения будут выполняться как сборки полного доверия из сетевого ресурса, поэтому мы предполагаем, что это должно работать нормально.

Любые идеи о том, как мы можем обойти эту проблему?

Кто-нибудь еще испытал эту проблему или кто-нибудь знает, почему это может произойти?

Пример программы

using System;
using System.Net;

namespace ProxyTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                String s = new WebClient().DownloadString("http://www.google.com");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}

app.config

  <?xml version="1.0"?>
  <configuration>
    <system.net>
      <defaultProxy useDefaultCredentials="true"/>
    </system.net>
    <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    </startup>
  </configuration>

Сведения об исключении

System.Net.WebException: An exception occurred during a WebClient request. ---> System.Configuration.ConfigurationErrorsException: Insufficient permissions for setting the configuration section 'defaultProxy'. ---> System.Security.SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Demand()
   at System.Net.Configuration.DefaultProxySection.PostDeserialize()
   --- End of inner exception stack trace ---
   at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
   at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSection(String configKey, Boolean getLkg, Boolean checkPermission)
   at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
   at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
   at System.Configuration.ConfigurationManager.GetSection(String sectionName)
   at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)
   at System.Net.Configuration.DefaultProxySectionInternal.GetSection()
   at System.Net.WebRequest.get_InternalDefaultWebProxy()
   at System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
   at System.Net.HttpRequestCreator.Create(Uri Uri)
   at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
   at System.Net.WebRequest.Create(Uri requestUri)
   at System.Net.WebClient.GetWebRequest(Uri address)
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   --- End of inner exception stack trace ---
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)
   at ProxyTest.Program.Main(String[] args) in Y:\Program.cs:line 12

Ответ 1

См. в статье базы знаний Майкрософт:

Симптомы:

  • Вы запускаете приложение на базе Microsoft.NET Framework 4, которое хранится в общем сетевом ресурсе.
  • Приложение вызывает статический метод в классе System.Configuration.ConfigurationManager. Например, приложение вызывает метод ConfigurationManager.GetSection.

В этом случае генерируется исключение System.Security.SecurityException, а затем сбой приложения.

Причина:

Проблема возникает из-за того, что метод не может получить доступ к разделу конфигурации из приложения на сетевом ресурсе.

Вы можете запросить исправление с этого сайта.

Ответ 2

Мы видели похожие симптомы - такое же сообщение об ошибке

Недостаточно прав для установки раздела конфигурации 'defaultProxy'

при запуске приложения консоли, где файлы были заблокированы.

Файлы были установлены путем загрузки zip файла из гиперссылки, и zip файл не был "разблокирован" перед распаковкой.

Разблокировка всех файлов (вы должны сделать их отдельно в Windows) в Проводнике > щелкните правой кнопкой мыши > Свойствa > Разблокировать проблему.