Я получаю сообщение об ошибке. IControllerFactory Orchard.Mvc.OrchardControllerFactory не вернул контроллер для имени «Данные». и если я использую OrchardServiceHostFactory в маршруте, я получаю Операция недопустима из-за текущего состояния объекта. WebServiceHostFactory работает нормально, хотя.

ан создал блогПочта указать, как использовать 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.

ОБНОВИТЬ

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

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

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

Orchard Root Web.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)

Ваш ответ на вопрос