URL службы WCF Orchard / MVC с областью - PullRequest
2 голосов
/ 26 апреля 2011

Бертран создал блог пост , чтобы указать, как использовать IoC в модулях WCF для Orchard.

В версии 1.1 вы можете создать файл SVC, используя новую фабрику хостов Orchard:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MyModule.IMyService, MyAssembly"
    Factory="Orchard.Wcf.OrchardServiceHostFactory, Orchard.Framework" %>
Then register your service normally as an IDependency but with service and operation contract attributes:

using System.ServiceModel;

namespace MyModule {
    [ServiceContract]
    public interface IMyService : IDependency {
        [OperationContract]
        string GetUserEmail(string username);
    }
}

Мой вопрос заключается в том, что все модули Орчарда действительно являются локальными. Итак, как вы можете построить маршрут, который попадает в файл SVC, созданный в области / модуля?

Если вы используете полный физический путь, чтобы добраться до файла SVC (пробовал это, и это вызывало проблему web.config, так как он соединял сайт и область).

http://localhost/modules/WebServices/MyService.svc

Или вы создаете ServiceRoute с помощью WebServiceHostFactory / OrchardServiceHostFactory?

new ServiceRoute("WebServices/MyService", new OrchardServiceHostFactory(), typeof(MyService))

Что бы я ни пытался, я получаю 404 при попытке попасть на ресурс. Я смог заставить это работать, используя проект приложения wcf и настроив WCF как отдельное приложение, мои проблемы начались при попытке перенести его в Orchard / MVC.

UPDATE

Спасибо за помощь Петр,

Это шаги, которые я предпринял для реализации сервиса.

Routes.cs

new RouteDescriptor {   Priority = 20,
                        Route = new ServiceRoute(
                                      "Services",
                                      new WebServiceHostFactory(),
                                      typeof(MyService)) }

Если я использую OrchardServiceHostFactory () вместо WebServiceHostFactory (), я получаю следующую ошибку.

Operation is not valid due to the current state of the object.

Orchard Root Web.Config

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

MyService

[ServiceContract]
public interface IMyService : IDependency
{
    [OperationContract]
    string GetTest();
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
class MyService : IMyService
{
    public string GetTest()
    {
        return "test";
    }
}

Я не смог заставить сервис работать, просто изменив модуль web.config. Я получаю следующую ошибку

ASP.NET routing integration feature requires ASP.NET compatibility.

ОБНОВЛЕНИЕ 2

Web-файл Orchard Root.Config

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <!-- ... -->
  </system.serviceModel>

Routes.cs

public IEnumerable<RouteDescriptor> GetRoutes() {
    return new[] {
                     new RouteDescriptor {   Priority = 20,
                                             Route = new ServiceRoute(
                                                 "Services",
                                                 new OrchardServiceHostFactory(),
                                                 typeof(IMyService))

                     }
                 };
}

Это работает, ключом здесь является то, что вы должны вызвать typeof для объекта, который ссылается на IDependency, WorkContextModule.IsClosingTypeOf не может обработать объект, который потребляет зависимость, он должен взять интерфейс, через который он напрямую вызывается.

1 Ответ

2 голосов
/ 27 апреля 2011

Как вы заявили, модули Orchard являются областями в терминах ASP.NET MVC, поэтому предоставленный вами URL-адрес неверен и должен быть:

http://localhost/Your.Orchard.Module/WebServices/MyService.svc

Где localhost - это виртуальный каталогв котором выполняется ваше приложение, а / WebServices - это папка в корне вашего модуля.

Вы также можете без проблем создать программный маршрут программно. Эта статья рассказывает, как добавлять новые маршруты в Orchard.Вы можете просто назначить ServiceRoute свойству Route RouteDescriptor вместо маршрута по умолчанию MVC (как показано в документации). Ранее задавался вопрос о добавлении ServiceRoute в приложение ASP.NET MVC с включенной областью, проверьте его, так как оно может вам помочь.

Кстати - вы также можете проверить этот SO вопрос о префиксных маршрутах обслуживания.

HTH

...