#c#
#c#
Вопрос:
Я должен установить строку подключения в Web.config с моего контроллера mvc. Я уже написал код, подобный приведенному ниже, и он может успешно редактировать строку подключения в Web.config, но проблема в том, что он добавляет дополнительные символы при сохранении в Web.config. Это дополнительные символы, amp;amp;
которые я не указал в string foo
переменной. Тогда мой вопрос в том, почему это добавляется автоматически при сохранении в Web.config? Как я могу пропустить эти символы при сохранении? Есть идеи?
С контроллера MVC я установил строку подключения в foo
переменную, как показано ниже:
string foo = @"metadata=res://*/edmxFileFactory.csdl|res://*/edmxFileFactory.ssdl|res://*/edmxFileFactory.msl;provider=System.Data.SqlClient;provider connection string=amp;quot;Data Source=10.110.1.77MASK,59931;Initial Catalog=FileFactory;User ID=connectWeb;Password=conn123$;MultipleActiveResultSets=True;App=EntityFrameworkamp;quot;";
var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
section.ConnectionStrings["FileFactoryEntities"].ConnectionString = foo;
configuration.Save();
В Web.config это сохраняется следующим образом-
<connectionStrings>
<add name="FileFactoryEntities" connectionString="metadata=res://*/edmxFileFactory.csdl|res://*/edmxFileFactory.ssdl|res://*/edmxFileFactory.msl;provider=System.Data.SqlClient;provider connection string=amp;amp;quot;Data Source=10.110.1.77MASK,59931;Initial Catalog=FileFactory;User ID=connectWeb;Password=conn123$;MultipleActiveResultSets=True;App=EntityFrameworkamp;amp;quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>
Комментарии:
1. Откуда
foo
берется? Можете ли вы заменитьamp;quot;
в нем на"
? Это приведет кamp;quot;
записи на вашweb.config
.2. Оригинальный вариант просто написан на c # внутри контроллера. Как вы можете видеть, я сохранил в переменной
foo
3.
amp;amp;
на самом деле этоamp;
ofamp;quot;
, который анализируется.4. Вы можете видеть, что я вообще не передаю
amp;amp;
. Внимательно смотрите вfoo
переменной5. Тогда я бы изменил его,
foo
содержит экранированный XML (amp;quot;
вместо"
). Это буквально то, что вы хотите записать в свой файл, но механизм, с помощью которого это записывается, выполняет экранирование за вас. Таким образом, он экранируется дважды. Следовательно,amp;amp;quot;
, посколькуamp;
выполняется экранирование.
Ответ №1:
В комментариях указано решение; однако, похоже, вы неправильно поняли суть.
TL; DR: решение в одной строке:
Замените каждое amp;quot;
вхождение на ""
в дословной строке C # foo
.
Объяснение:
В атрибуте XML кавычки должны быть экранированы, иначе их можно перепутать с кавычками самого атрибута. Следовательно, когда вы сохраняете атрибут в XML, содержащий кавычки, они будут экранированы amp;quot;
сущностью.
Теперь вы скопировали сохраненный XML-атрибут, не экранируя сущности (т.Е. вы изменили значение connection string="..."
на connection string=amp;quot;...amp;quot;
). Когда такое значение собирается быть сохранено снова, средство записи XML не увидит никаких кавычек для экранирования, но теперь видит амперсанды, которые также должны экранироваться, потому что обычно в XML амперсанд является первым символом экранируемого объекта. Поэтому amp;
теперь заменяется на amp;amp;
.
В строках C # символы, заключенные в кавычки, также должны быть экранированы. Для обычных строк вы должны использовать "
для кавычек, а в дословных строках вы должны удвоить кавычки. Итак, просто замените каждую amp;quot;
на ""
в вашей foo
переменной C #, и все в порядке.
Комментарии:
1. Работает! Спасибо, чувак. Просто заменено
amp;quot;
на""