REST 4.0 & Ninject.Extensions.Wcf 2.3 NullReferenceException - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь создать простую службу REST с .NET 4.0, которая использует ninject для внедрения любых зависимостей для службы.

Вот так выглядит мой сервис:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ReportService
{
    private readonly ReportManager _reportManager;

    public ReportService(ReportManager reportManager)
    {
        _reportManager = reportManager;
    }

    [WebInvoke(UriTemplate = "GetReports", Method = "GET")]
    public List<ReportDTO> GetReports()
    {
        var reports = _reportManager.GetReports();
        return reports.ToList();
    }
}

Это мой global.asax:

public class Global : NinjectHttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        RouteTable.Routes.Add(new ServiceRoute("ReportService", new NinjectWebServiceHostFactory(), typeof(ReportService)));
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new ServiceModule());
    }
}

И мой сервисный модуль:

public class ServiceModule : NinjectModule 
{
    public override void Load()
    {
        Bind<IFRSDbContext>().To<FRSDbContext>().InRequestScope();
        Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope();
        Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
        Bind<IReportRepository>().To<ReportRepository>();
        Bind<ReportManager>().ToSelf();
        Bind<ReportService>().ToSelf();
    }
}

Я продолжаю получать следующее исключение, когда пытаюсь запустить свой сервис:

Описание: необработанное исключение произошло во время выполнения текущий веб-запрос. Пожалуйста, просмотрите трассировку стека для более информация об ошибке и ее возникновении в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект отсутствует установить экземпляр объекта.

Ошибка источника:

Во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение можно определить с помощью трассировки стека исключений ниже.

Трассировка стека:

[NullReferenceException: Object reference not set to an instance of an object.]
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +222
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Object reference not set to an instance of an object.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9079228
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256

РЕДАКТИРОВАТЬ

Я обновил до последней версии моего Сервиса .. Я использую Ninject 2.3 и Ninject.Extensions.Wcf 2.3 из здесь , но все еще не везет ... что я делаю не так ? Я следовал всему из примера WcfTimeService за исключением того, что я использую службу REST, а не службу .svc Wcf ...

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Вы не должны вызывать Application_Start.Вместо этого переопределите OnApplicationStarted

0 голосов
/ 14 декабря 2011

После загрузки источников Ninject.Web.Common и Ninject.Extensions.Wcf мне удалось отследить проблему.

Чтобы это работало без файла * .svc, вам нужно вызвать метод Application_Start() для NinjectHttpApplication в конце файла Application_Start() в файле Global.asax.cs, например:

public class Global : NinjectHttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
        Application_Start(); // added call
    }

    private void RegisterRoutes()
    {
        RouteTable.Routes.Add(new ServiceRoute("ReportService", new NinjectWebServiceHostFactory(), typeof(ReportService)));
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new ServiceModule());
    }
}

Без этого Ядро никогда не создается, и поэтому именно это и вызывает NullReferenceException. После того, как я это сделал, все стало работать отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...