WCF — реализация ServiceHostFactory для использования в контексте IIS (файл svc)

Я успешно реализовал автономную службу WCF. Что касается устаревших версий, конфигурация привязки хоста считывается из нестандартного источника (вместо app.config). При портировании этой службы в IIS я столкнулся с проблемой загрузки настроек и обнаружил, что решение будет включать реализацию класса, унаследованного от ServiceHostFactory.

Моя проблема, однако, заключается в том, что метод CreateServiceHost получает только конкретный тип и URI из файла SVC, но я хотел повторно использовать этот класс для дальнейших реализаций и нуждался в дополнительной информации: например, интерфейс, который определяет ServiceContract и привязку уже настроен.

Я нашел эту замечательную статью от @carlosfigueira, но его реализация использует фабрику для возврата узла, специфичного для службы, в отношении 1-к-1. Я, конечно, могу это сделать, но это приведет к нескольким конкретным фабрикам с большим количеством кода для копирования и вставки, и я бы не стал этого избегать. Является ли это возможным? Если да, то как я могу это сделать?


person Gerardo Lima    schedule 18.05.2012    source источник
comment
Ваша фабрика услуг, когда она получает конкретную услугу, должна быть в состоянии разрешить эту информацию, не так ли?   -  person Darren Kopp    schedule 18.05.2012
comment
Поскольку атрибут ServiceContract не наследуется, я полагаю, что мне нужно передать интерфейс, который его объявляет (вместо конкретного класса), при выполнении метода AddServiceEndpoint. Кроме того, мне нужен еще один параметр для загрузки правильных настроек привязки. Интересно, могу ли я передать дополнительные параметры в ServiceHostFactory...   -  person Gerardo Lima    schedule 18.05.2012
comment
Отредактируйте вопрос, указав немного больше информации о том, чего вы пытаетесь достичь, мне трудно понять, чего именно вы хотите. Я использую одну пользовательскую фабрику, и она проходит в конкретном классе, но конфигурация выполняется в web.config.   -  person Darren Kopp    schedule 18.05.2012
comment
Привет, @DarrenKopp, к сожалению, я не могу использовать web.config, и мне нужно загрузить конфигурацию/привязку службы из нестандартного источника. Однако ServiceHostFactory вызывается .SVC только с конкретным экземпляром реализации Type и базовыми адресами URI. Следовательно, как я могу обнаружить ServiceContract(s), которые реализованы этим конкретным классом? Более того, мне нужен ключ для загрузки правильных настроек конфигурации, а его нельзя проверить по метаинформации...   -  person Gerardo Lima    schedule 21.05.2012


Ответы (1)


Нет встроенного способа выяснить, какие контракты реализуются классом службы, но код не должен быть слишком сложным. Это что-то вроде функции ниже. Вам понадобится некоторая логика для определения относительного адреса, если у вас есть несколько типов контрактов (т. е. если у вас есть один контракт, используйте "", если у вас несколько, используйте имя контракта в качестве адреса).

private IEnumerable<Type> GetContractType(Type serviceType) 
{ 
    if (HasServiceContract(serviceType))
    { 
        yield return serviceType; 
    } 

    var contractInterfaceTypes = serviceType.GetInterfaces() 
        .Where(i => HasServiceContract(i));

    foreach (var type in contractInterfaceTypes)
    {
        yield return type;
    }

    // if you want, you can also go to the service base class,
    // interface inheritance, etc.
} 

private static bool HasServiceContract(Type type) 
{ 
    return Attribute.IsDefined(type, typeof(ServiceContractAttribute), false); 
}
person carlosfigueira    schedule 18.05.2012
comment
Привет, @carlosfigueira, спасибо за твое предложение. Я уже подозревал, что мне нужно углубиться в Reflection, чтобы рекурсивно получить базовые классы и реализованные интерфейсы (я уже делаю что-то подобное для экспорта известных типов службы), но я бы предпочел этого избежать, потому что это затрудняет чтение кода. Думаю, я собираюсь придерживаться более простого решения, чтобы создать фабрику, специфичную для каждого файла SVC, поэтому я заранее знаю, какой ключ я должен использовать для загрузки настроек и какой ServiceContract реализован. Иногда я очень разочаровываюсь в WCF... - person Gerardo Lima; 21.05.2012