Хост WCF на сайте MVC2 - PullRequest
       18

Хост WCF на сайте MVC2

3 голосов
/ 13 января 2011

У нас очень большой и сложный веб-сайт MVC2.Мы хотим добавить API для некоторых внутренних инструментов и решили использовать WCF.

В идеале, мы хотим, чтобы MVC сам размещал службу WCF.Причины:

  • Несмотря на то, что приложение имеет несколько уровней, для некоторых функций, которые нам нужны в API, необходим сам сайт (например, форматирование электронных писем).
  • Мы используем TFS для автоматического- сборка (непрерывная интеграция) и развертывание - чем меньше нам нужно изменить механизм сборки и выпуска, тем лучше
  • Мы используем контейнер Unity и Inversion of Control во всем приложении.Участие в веб-сайте позволило бы нам повторно использовать классы конфигурации и другие вспомогательные методы.

Я написал собственный ServiceBehavior, который, в свою очередь, имеет собственный InstanceProvider - это позволяет мне создавать экземпляры и настраиватьконтейнер, который затем используется для обслуживания всех запросов на экземпляры классов из WCF.

Так что мой вопрос таков;Можно ли разместить службу WCF внутри самого MVC?

Раньше у меня был только опыт работы с сайтами Services / Standard Asp.Net, и я не знал, что MVC2 может отличаться, пока я не попытался подключить его.в конфиг и ничего не произошло .После некоторого поиска в Google, кажется, не так много ссылок на это - так что я бы хотел спросить здесь.

Подробнее:

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

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"
                               aspNetCompatibilityEnabled="true">
        <serviceActivations>
            <add relativeAddress="Job.svc"
                 service="MyApplication.WebJobManager"
                 factory="System.ServiceModel.Activation.WebServiceHostFactory" />
        </serviceActivations>
    </serviceHostingEnvironment>
    <extensions>
        <behaviorExtensions>
            <add name="WCFDIBehavior" type="MyApplication.Jobs.WCFDIBehaviorExtension, MyApplication.Jobs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>
    <standardEndpoints>
        <mexEndpoint>
            <standardEndpoint name="WebJobManagerMex" />
        </mexEndpoint>
    </standardEndpoints>
    <behaviors>
        <serviceBehaviors>
            <behavior name="JobServiceBehavior">
                <serviceMetadata />
                <WCFDIBehavior />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="" name="MyApplication.Jobs.WebJobManager">
            <endpoint binding="basicHttpBinding"
              bindingConfiguration="" name="HTTPEndpoint" contract="MyApplication.JobService.Interfaces.IWebJobManager" />
        </service>
    </services>
</system.serviceModel>

Может кто-нибудь сказать мне, если что-то выглядит явно неправильно?

Я ожидал найти конечную точку в http://localhost/MyApplication/Job.svc и метаданные в http://localhost/MyApplication/Job.svc?mex, но оба дают 404. Насколько я могу судить, нет никаких явных признаков того, что WCF работает вообще.Возможно, мне нужно что-то сделать с моими маршрутами?

NB: В случае, если у других возникла эта проблема, мне пришлось добавить routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}") в настройку Route в Global.asax, чтобы предотвратить MVCперехват вызова.

Ответы [ 2 ]

10 голосов
/ 13 января 2011

Да, это возможно. Я использую его в своих проектах и ​​буду счастлив.

Чтобы добавить службу WCF в свой проект, вам нужно добавить новый элемент Ctrt + Shift + A и выбрать «Служба WCF». Таким образом, будет добавлена ​​простая служба WCF и изменен файл web.config. Может потребоваться изменить созданный файл SVC, например, чтобы использовать «System.ServiceModel.Activation.WebServiceHostFactory». Начиная с .NET 4.0 вы можете удалить файл SVC и использовать вместо него <serviceActivation> с той же информацией. Например,

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"
                           aspNetCompatibilityEnabled="true">
    <serviceActivations>
        <add relativeAddress="My.svc"
             service="MyNamespace.MyClass"
             factory="System.ServiceModel.Activation.WebServiceHostFactory" />
    </serviceActivations>
</serviceHostingEnvironment>

Одно небольшое замечание. Если вы вызываете некоторые методы WCF внутри MVC, вам нужно будет использовать HttpContext.Current вместо WebOperationContext.Current. Я проверяю всегда в коде WCF, если WebOperationContext.Current == NULL, затем использую HttpContext.Current.

1 голос
/ 13 января 2011

Да, это возможно.Единственное, что вам нужно, это добавить файл «.svc», который указывает на ваш класс обслуживания и имеет свойство фабрики, установленное на вашу фабрику хоста.Вот так:

<%@ServiceHost language="c#" Debug="true" 
    Service="Services.Implementations.UserValidator"
    Factory="Services.Factories.CustomServiceHostFactory"  %>

Другие вещи такие же, как добавление конфигурации в файл конфигурации и т. Д.

...