WCF: где разместить конфигурацию и как разрешить относительные пути без HTTPContext - PullRequest
3 голосов
/ 05 октября 2009

Недавно я принял решение перенести существующие службы asmx на WCF. Теперь я создал новое решение, которое содержит библиотеку служб WCF (на которую в конечном итоге будет ссылаться веб-сайт WCF).

Мой старый код в значительной степени опирался на HTTPContext, но, насколько я понимаю, это противоречит точке WCF Services, которая по своей природе может запускаться из любого контекста, будь то что угодно, от консольного приложения до плагина MS Outlook (ну, конечно, немного экстремально, но вы поняли)

До того, как у меня была моя конфигурация в web.config, я все еще сохраняю свою конфигурацию там или больше в службе WCF.

С веб-сайтом WCF, есть ли теперь более общий способ ссылаться на пути, не на основе HTTPContext, а на путь выполнения приложения, чтобы я мог написать код, который будет работать где угодно? (Примечание: в прошлом в asmx app путь выполнения был каталогом bin).

Итак, подведем итог вот вопросы:

  1. Где лучше всего хранить значения конфигурации, в web.config веб-сайта WCF или в app.config библиотеки служб WCF?
  2. Как я могу отказаться от использования HTTPContext для относительного расположения файлов и реализовать более общий подход, чтобы лучше использовать возможность запуска служб WCF где угодно.

Ответы [ 3 ]

2 голосов
/ 05 октября 2009
  1. Конфигурация хранится в файле конфигурации процесса, в котором размещается служба WCF. Таким образом, это означает, что в вашем сценарии вы включили бы конфигурацию WCF в web.config веб-сайта, ссылающегося на и размещающего сервисы. Если бы вы запускали модульный тест, вам нужно было бы включить конфигурацию в app.config тестовой сборки.

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

    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    
1 голос
/ 05 октября 2009

Вопрос 1

Что сказал Марк_с:

  • Если ваш хост является виртуальным каталогом (IIS, VSDS, WAS и т. Д.), То значения конфигурации сохраняются в файле web.config хоста.
  • Если ваш хост является приложением (WinForms, WPF, Service, Console и т. Д.), То значения конфигурации сохраняются в файле app.config хоста.

Это немного сбивает с толку, потому что WCF позволяет вам размещать хостинг, контракты и реализацию либо в одном проекте, либо в разных проектах. Просто запомните, независимо от типа хоста и места расположения кода реализации, данные конфигурации (и файлы данных) всегда сохраняются в проекте хоста.

Вопрос 2

Что-то в этом духе должно сработать. Эти свойства HttpRuntime возвращают действительную информацию для приложения, размещенного на IIS, даже если в вашем коде нет действительного HttpContext.

static string GetDataFilePath() {
    string path;
    if(HttpRuntime.AppDomainAppVirtualPath != null) {
        // We are hosted in IIS, so the data files are in the virtual directory's data folder.
        path = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data");
    } else {
        // We are hosted in an application, so the data files are in the same directory as the assembly.
        path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    }
    return path ?? string.Empty;
}
  • Если ваш хост является виртуальным каталогом, поместите файлы данных в папку App_Data проекта хоста и установите CopyToOutputDirectory = DoNotCopy.
  • Если ваш хост является приложением, поместите ваши файлы данных в корень проекта хоста и установите CopyToOutputDirectory = CopyAlways.
1 голос
/ 05 октября 2009
  1. Где лучше всего хранить значения конфигурации, в web.config веб-сайта WCF или в app.config библиотеки служб WCF?

Это зависит от вашего выбора хостинга:

  • , если вы размещаете свои сервисы WCF в IIS, тогда лучшим местом для хранения вашей конфигурации действительно является ваш web.config
  • если вы выполняете хостинг самостоятельно, например, размещаете свои сервисы WCF в службе NT, консольном приложении или чем-то еще, то поместите конфигурацию WCF в app.config этого хоста приложения.* У служебных библиотек (сборок DLL) нет собственных файлов конфигурации - вам нужно поместить свою конфигурацию в конфигурацию хост-приложения.
    Как я могу отказаться от использования HTTPContext для относительного расположения файлов и реализовать более общий подход, чтобы лучше использовать запуск служб WCF в любом месте.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...