Если вы используете mac os для запуска некоторых задач в автономном режиме,
Просто не забудьте включить remote ssh connection
в ваш system preference -> sharing
(я не знаю, почему мы должны делать что)
Перед тем, как включить его, мне понадобится около 1 минуты для запуска spark-submit xx.py
. После включения его мне потребуется всего 3 секунды, чтобы запустить его.
Надеюсь, это поможет другим людям решить проблемы на платформе Mac os
У меня есть тенденция программно настроить все мои сервисные настройки.
Мои клиенты не являются действительно типом для понимания XML и попросили, чтобы я сделал конфигурационные файлы больше как старый стиль INI.
Это легко сделать (читающий код файла INI, не включенный):
// create the URI which is used as the service endpoint
Uri tcpBaseAddress = new Uri(
string.Format("net.tcp://{0}:{1}",
LocalIPAddress.ToString(), GeneralPortNumber));
// create the net.tcp binding for the service endpoint
NetTcpBinding ntcBinding = new NetTcpBinding();
ntcBinding.Security.Mode = SecurityMode.None;
System.ServiceModel.Channels.Binding tcpBinding = ntcBinding;
// create the service host and add the endpoint
Host = new ServiceHost(typeof(WordWarService), tcpBaseAddress);
, Так как мы можем настроить хост (и клиент, в этом отношении) программно, нет ничего мешающего Вам предоставить настройки любым способом, который Вы выбираете (база данных, xml, сумасшедший текстовый файл, и т.д.).
Можно выделить конфигурацию WCF с помощью configSource. Инструкции здесь:
Другая опция состоит в том, чтобы настроить Ваши сервисы WCF программно.
using System;
using System.Configuration;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Configuration;
namespace ConsoleHost
{
public class CustomServiceHost : ServiceHost
{
public CustomServiceHost(string customConfigPath, Type serviceType,
params Uri[] baseAddresses)
{
CustomConfigPath = customConfigPath;
var collection = new UriSchemeKeyedCollection(baseAddresses);
InitializeDescription(serviceType, collection);
}
public string CustomConfigPath { get; private set; }
protected override void ApplyConfiguration()
{
if (string.IsNullOrEmpty(CustomConfigPath) ||
!File.Exists(CustomConfigPath))
{
base.ApplyConfiguration();
}
else
{
LoadConfigFromCustomLocation(CustomConfigPath);
}
}
void LoadConfigFromCustomLocation(string configFilename)
{
var filemap = new ExeConfigurationFileMap
{
ExeConfigFilename = configFilename
};
Configuration config = ConfigurationManager.
OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);
var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config);
bool loaded = false;
foreach (ServiceElement se in serviceModel.Services.Services)
{
if (se.Name == Description.ConfigurationName)
{
LoadConfigurationSection(se);
loaded = true;
break;
}
}
if (!loaded)
throw new ArgumentException("ServiceElement doesn't exist");
}
}
}
После этого класса просто используйте его, как обычно, для инициализации хоста службы
myServiceHost = new CustomServiceHost (ConfigFileName, typeof (QueryTree));
myServiceHost.Open ();
Я стремился делать то же - в основном ровный один шаг вперед: поместите мою конфигурацию WCF в таблицу базы данных (так как я могу измениться, это - не может получить доступ к файловой системе на моем размещенном поставщике для изменения файлов конфигурации :-().
, К сожалению, это кажется менее, чем простым.....
В основном, это сводится к необходимости записать Вашему собственному потомку "ServiceHost", который может обработать конфигурацию по мере необходимости.
Вот пример загрузка конфигурация WCF от пользовательского местоположения конфигурации .
Это могло бы получить Вас движение? Я все еще надеюсь, что смогу выяснить, что "загрузка моей конфигурации от таблицы базы данных" однажды..... просто должна подавить шумы недели на работе, я предполагаю :-)
У меня есть приложение на работе, которая работает отчасти как то, о чем Вы говорите здесь. У нас есть несколько сервисов WCF через несколько проектов, и вся их конфигурационная информация находится в единственном файле конфигурации.
решение, которое выбрала моя компания, состояло в том, чтобы прочитать сервисную конфигурацию из файла конфигурации и затем программно настроить привязку, поведение, и т.д. на основе чтения значений. Значения в файле конфигурации не соответствуют конфигурации, наполняют Вас, обычно видят в сервисах WCF - это было разработано, чтобы легко использоваться классом помощника для реализации всей конфигурации во время выполнения.
Однако я не большой поклонник выполнения этого вообще - слишком много продолжения связи, и это довольно грязно.
Это действительно, тем не менее, показывает, что это возможно - это - одна вещь думать о в Вашем дизайне.
Можно сделать как это:
<system.serviceModel configSource="wcf.config"/>
Просто отключает Ваш раздел модели услуг и помещает его в отдельный файл. Необходимо будет поместить целый раздел в отдельный файл конфигурации; использование этого метода, у Вас не может быть раздела, охватывает несколько файлов AFAIK.
Я нашел эту статью, которая может вам помочь. Я не пробовал, но это кажется довольно простым.
" Атрибут configSource впервые был введен в .NET framework 2.0 для поддержки внешних файлов конфигурации. Этот атрибут можно добавить в любой раздел конфигурации, чтобы указать внешний файл для этого раздела.
К сожалению, группа разделов system.serviceModel не поддерживает этот атрибут. Если вы попытаетесь добавить его, вы получите следующее исключение:
Атрибут 'configSource' не может быть указан, потому что его имя начинается с зарезервированного префикса 'config' или 'lock'
Я выяснил, что вы этот атрибут можно использовать в различных разделах system.serviceModel, таких как службы, поведения или привязки. "
System.ServiceModel.Configuration.ConfigurationChannelFactory
и др. поддерживают чтение конфигурации из экземпляра System.Configuration.Configuration
. Это означает, что вы можете поместить
SharePoint 2010 чрезмерно использует это в своей модели сервисных приложений, где каждый сервисный прокси читает свои настройки из специального .config, который не обязательно является web.config или app.config и даже не ссылается оттуда.