Ninject dependency for Ninject.Web.WebApi.OwinHost v3.2.x - asp.net-web-api

I'm attempting to ninject ApiControllers in an Azure worker role. I've previously accomplished ninjection with the same controllers in an asp.net mvc 5 / web api 2 project in the same solution. Another non ninjected test controller in this WorkerRole project work and serve expected results.
While attempting to add the NuGet package Ninject.Web.WebApi.OwinHost (version 3.2.x) it looks like that package is ?erroneously? requiring a Ninject version ≥ 3.0.0.0 && < 3.1.0.0
I've tried
Install-Package Ninject.Web.WebApi.OwinHost -ProjectName WorkerRole1
Install-Package Ninject.Web.WebApi.OwinHost -Pre -ProjectName WorkerRole1
Install-Package Ninject.Web.WebApi.OwinHost -Version 3.2.0 -ProjectName WorkerRole1
Install-Package Ninject.Web.WebApi.OwinHost -Version 3.2.1-unstable-002 -ProjectName WorkerRole1
I was able to successfully add Ninject.Web.WebApi.SelfHost, however I believe I need the owin flavor and SelfHost didn't appear to install NinjectWebCommon.cs or equivalent. I don't know where to wire up ninject to the owin self host in the worker role once I am successful at including the OwinHost. I'm assuming it will be scaffold-ed in.
Result of attempting to install Ninject.Web.WebApi.OwinHost
PM> Install-Package Ninject.Web.WebApi.OwinHost -Pre -ProjectName WorkerRole1
Attempting to resolve dependency 'Ninject.Web.WebApi (≥ 3.2.0-unstable)'.
Attempting to resolve dependency 'Ninject (≥ 3.2.0.0 && < 3.3.0.0)'.
Attempting to resolve dependency 'Ninject.Web.Common (≥ 3.2.0.0 && < 3.3.0.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi (≥ 5.0 && < 6.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.WebHost (≥ 5.1.2 && < 5.2.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (≥ 5.1.2 && < 5.2.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (≥ 5.1.2)'.
Attempting to resolve dependency 'Newtonsoft.Json (≥ 4.5.11)'.
Attempting to resolve dependency 'Ninject.Web.Common.OwinHost (≥ 3.0 && < 4.0)'.
Attempting to resolve dependency 'Ninject.Extensions.ContextPreservation (≥ 3.0 && < 4.0)'.
Attempting to resolve dependency 'Ninject (≥ 3.0.0.0 && < 3.1.0.0)'.
Install-Package : Updating 'Ninject 3.2.2.0' to 'Ninject 3.0.1.10' failed. Unable to find versions of 'Ninject.Web.WebApi, Ninject.Web.Common' that are compatible with 'Ninject 3.0.1.10'.
At line:1 char:1
+ Install-Package Ninject.Web.WebApi.OwinHost -Pre -ProjectName WorkerRole1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Install-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand
PM>
Probably unrelated however in checking versions of installed package in the WorkerRole I note that a number of packages are IIS specific. Are these needed in an Azure WorkerRole Owin self host? And specifically for Microsoft.AspNet.WebApi.SelfHost I see the following notation yet I do have Microsoft.AspNet.WebApi.OwinSelfHost installed.
This is a legacy package for hosting ASP.NET Web API within your own
process (outside of IIS). Please use the
Microsoft.AspNet.WebApi.OwinSelfHost package for new projects.
Installed packages in WorkerRole
PM> Get-Package -ProjectName WorkerRole1
Id Version Description/Release Notes
-- ------- -------------------------
EntityFramework 6.1.0 Entity Framework is Microsoft's recommended data access technology for new applications.
Microsoft.AspNet.Identity.Core 2.0.0 Core interfaces for ASP.NET Identity.
Microsoft.AspNet.Identity.E... 2.0.0 ASP.NET Identity providers that use Entity Framework.
Microsoft.AspNet.WebApi 5.0.0 This package contains everything you need to host ASP.NET Web API on IIS. ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad range of client...
Microsoft.AspNet.WebApi.Client 5.1.2 This package adds support for formatting and content negotiation to System.Net.Http. It includes support for JSON, XML, and form URL encoded data.
Microsoft.AspNet.WebApi.Core 5.1.2 This package contains the core runtime assemblies for ASP.NET Web API. This package is used by hosts of the ASP.NET Web API runtime. To host a Web API in IIS use the Microsoft.AspNe...
Microsoft.AspNet.WebApi.Owin 5.1.2 This package allows you to host ASP.NET Web API within an OWIN server and provides access to additional OWIN features.
Microsoft.AspNet.WebApi.Owi... 5.1.2 This package allows you to host ASP.NET Web API within your own process using the OWIN HttpListener server. ASP.NET Web API is a framework that makes it easy to build HTTP services ...
Microsoft.AspNet.WebApi.Sel... 5.1.2 This is a legacy package for hosting ASP.NET Web API within your own process (outside of IIS). Please use the Microsoft.AspNet.WebApi.OwinSelfHost package for new projects.
Microsoft.AspNet.WebApi.Web... 5.0.0 This package contains everything you need to host ASP.NET Web API on IIS. ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad range of client...
Microsoft.Data.Edm 5.6.1 Classes to represent, construct, parse, serialize and validate entity data models. Targets .NET 4.0, Silverlight 4.0, or .NET Portable Lib with support for .NET 4.0, SL 4.0, Win Pho...
Microsoft.Data.OData 5.6.1 Classes to serialize, deserialize and validate OData payloads. Enables construction of OData producers and consumers. Targets .NET 4.0, Silverlight 4.0 or .NET Portable Lib with sup...
Microsoft.Data.Services.Client 5.6.1 LINQ-enabled client API for issuing OData queries and consuming OData payloads. Supports OData v3. Targets .NET 4.0, Silverlight 4.0 or .NET Portable Lib with support for .NET 4.5, ...
Microsoft.Owin 2.1.0 Provides a set of helper types and abstractions for simplifying the creation of OWIN components.
Microsoft.Owin.Diagnostics 2.1.0 Provides middleware components to assist in developing OWIN-based applications.
Microsoft.Owin.Host.HttpLis... 2.1.0 OWIN server built on the .NET Framework's HttpListener class. Currently the default server used for self-hosting.
Microsoft.Owin.Hosting 2.1.0 Provides default infrastructure types for hosting and running OWIN-based applications.
Microsoft.Owin.SelfHost 2.1.0 Includes components needed to host an OWIN-based application in a custom process.
Microsoft.WindowsAzure.Conf... 2.0.3 Windows Azure Configuration Manager provides a unified API to load configuration settings regardless of where the application is hosted - whether on-premises or in a Cloud Service.
Newtonsoft.Json 6.0.2 Json.NET is a popular high-performance JSON framework for .NET
Ninject 3.2.2.0 Stop writing monolithic applications that make you feel like you have to move mountains to make the simplest of changes. Ninject helps you use the technique of dependency injection ...
Ninject.Web.Common 3.2.0.0 Bootstrapper for web projects
Ninject.Web.Common.Selfhost 3.2.0.0 Adds self hosting support to web common.
Ninject.Web.WebApi 3.2.0.0 Extension for Ninject providing integration with ASP.NET MVC WebAPI 2
Ninject.Web.WebApi.Selfhost 3.2.0.0 Extension for Ninject providing integration with ASP.NET MVC WebAPI 2 Selfhost
Owin 1.0 OWIN IAppBuilder startup interface
System.Spatial 5.6.1 Contains classes and methods that facilitate geography and geometry spatial operations. Targets .NET 4.0, Silverlight 4.0 or .NET Portable Lib with support for .NET 4.0, SL 4.0, Win...
WindowsAzure.Storage 3.1.0.1 This client library enables working with the Windows Azure storage services which include the blob service for storing binary and text data, the table service for storing structured...
PM>

I know this is late, but I ran into this same problem and found this question via a Google search. I eventually got around it with -DependencyVersion:
Install-Package Ninject.Web.WebApi.OwinHost -DependencyVersion Highest
If you don't want to update all of the dependent NuGet packages, I found that manually installing all of the Ninject-related dependencies for Ninject.Web.WebApi.OwinHost and then installing Ninject.Web.WebApi.OwinHost also got around the issue.

I was facing the same problem today and I solved it by the following
add the following class implementation to your project
public class NinjectDependencyScope : IDependencyScope
{
IResolutionRoot resolver;
public NinjectDependencyScope(IResolutionRoot resolver)
{
this.resolver = resolver;
}
public object GetService(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has been disposed");
return resolver.TryGet(serviceType);
}
public System.Collections.Generic.IEnumerable<object> GetServices(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has been disposed");
return resolver.GetAll(serviceType);
}
public void Dispose()
{
IDisposable disposable = resolver as IDisposable;
if (disposable != null)
disposable.Dispose();
resolver = null;
}
}
// This class is the resolver, but it is also the global scope
// so we derive from NinjectScope.
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectDependencyScope(kernel.BeginBlock());
}
}
2- then in NinjectWebCommon
add the following line of code to this method CreateKernel():
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
so the complete implementation will be:
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
// Install our Ninject-based IDependencyResolver into the Web API config
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
RegisterServices(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
I tried this code my self and it works successfully

Related

Call Dynamics 2011 from .Net Core 2.1 WebApp

I need to call some Dynamics 2011 CRM WebServices from a WebApi build on .Net Core 2.1.
To use CRM SDK I need these dependencies :
- Microsoft.Xrm.Sdk.2011 5.0.18
- Microsoft.Crm.Sdk.Proxy.2011 5.0.18
- Microsot.IdentityModel 6.1.7600.16394
When I call my method this exception is raised :
System.TypeLoadException : 'Could not load type 'System.ServiceModel.Description.MetadataConversionError' from assembly 'System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.'
at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1..ctor(Uri serviceUri, Boolean checkForSecondary)
at Microsoft.Xrm.Sdk.Client.OrganizationServiceConfiguration..ctor(Uri serviceUri)
at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateManagement[TService](Uri serviceUri)
Is there any workaround to avoid this exception ?
This problem also occurs in IIS Express and aspnet_regiis -iru could no be applied.
I think it is more a .Net Core issue with 4.5 assemblies.
Thanks in advance.

system.net.http not found in Xamarin Forms

In my xamarin application I need to implement the web-service using HttpClient.
So I create the test project & test the web-service - No problem here.
My code:
public async Task<string> registrationRequest()
{
HttpClient client = new HttpClient();
string response = await client.GetStringAsync(registrationURL);
return response;
}
My problem:
After test the testing application I use the same code in my live project
system.net.http not found error.
HttpClient - not resolved.
In my test project I am not install any Nuget packages.
I just use the
using System.Net.Http;
But in my live project this import return error.
Anyone help me out..
You need to install the Microsoft.Net.Http nuget package in your PCL and platform-specific projects.

"The type TraceWriter must derive from ITraceWriter" after upgrading to Web API 2

We have a custom Web API ITraceWriter implementation named TraceWriter, registered as a service in the usual way in Application_Start.
After upgrading the Web API project to Web API 2, an HttpException is thrown in Application_Start:
The type TraceWriter must derive from ITraceWriter.
Parameter name: service
at System.Web.Http.Controllers.ServicesContainer.Replace(Type serviceType, Object service)
Of course, the TraceWriter actually is deriving from ITraceWriter, so what is the problem?
The TraceWriter implementation was located in a different project, which still referenced System.Web.Http, Version=4.0.0.0. Installing the latest Microsoft.AspNet.WebApi.Core package in this project solved the problem.

Visual Studio does not creates a proxy for OData v3 service

I have created an OData v3 service which includes EntityTypes with properties whose type is a collection (http://www.odata.org/documentation/odata-version-3-0/common-schema-definition-language-csdl#csdl5.1), for example:
<EntityType Name="Apps">
…
<Property Name="tags" Nullable="false" Type="Collection(Edm.String)"/>
…
</EntityType>
I have created a client for that service with Visual Studio (2012 and 2013) through right click in the project > Add Service Reference which creates a proxy class (AndroidContext in my example) for the service.
My problem is, when I try to retrieve an entity:
var app = androidContext.Apps.Where(a => a.Title == "Some title").First();
it throws an InvalidOperationException:
"Collection types are only supported in version 3.0 of the OData protocol and higher versions. They are not supported in version 2.0."
I have found that the proxy class created by Visual Studio has only one constructor which receives as only parameter the URI of the service. This constructor calls a base constructor (of the inherited class DataServiceContext) that use Odata v2 by default:
public DataServiceContext(Uri serviceRoot)
: this(serviceRoot, DataServiceProtocolVersion.V2)
{
}
I don’t understand why there is not a constructor that allows the creation of a proxy for OData v3. The solution I have used is to declare a new constructor for the proxy class (is partial) that allows OData v3:
public partial class AndroidContext
{
public AndroidContext(Uri serviceRoot, DataServiceProtocolVersion version) :
base(serviceRoot, version)
{
//The same that the generated constructor do
}
}
Does someone knows why Visual Studio does not allows the use of OData v3 by default? Does someone knows another solution?

Error using Autofac with ASP.NET Web API RC and ASP.NET MVC3

I added ASP.NET Web API RC to my MVC3 project using NuGet:
Install-Package AspNetWebApi
Then I configured it. In Global.asax.cs:
// configure regular controllers
var configuration = GlobalConfiguration.Configuration;
var container = Bootstrapper.ConfigureContainer(configuration);
containterProvider = new ContainerProvider(container);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// Set the dependency resolver implementation for Web API.
var resolver = new AutofacWebApiDependencyResolver(container);
configuration.DependencyResolver = resolver;
And in Boostrapper.ConfigureContainer(...) I added:
// I register my types as InstancePerLifetimeScope()
// but I also tried .InstancePerHttpRequest().InstancePerApiRequest()
// to the same end
builder.RegisterType<SomeService>()
.AsImplementedInterfaces().InstancePerLifetimeScope();
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterWebApiFilterProvider(config);
This is described here and here.
I also updated Autofac, Autofac.Web, Autofac.Mvc3 packages using NuGet and installed Autofac.WebApi package.
With this configuration I tried running my ApiController and got the following error:
No scope with a Tag matching 'httpRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being reqested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
Then as I read this comment from Alex Meyer-Gleaves:
I suspect you are using the Web API package with MVC3 and this is causing the problem. In the MVC3 integration the tag for the InstancePerHttpRequest lifetime scope was "httpRequest". It was in the MVC4 Beta and Web API Beta packages that I changed both InstancePerHttpRequest and InstancePerApiRequest to use the common tag "AutofacWebRequest". You can grab the MVC4 integration package from NuGet using Autofac.Mvc4.
source article with comment
So following the advice from Alex I got the package Autofac.Mvc4 but it works only with Mvc4 and my project wouldn't build. I then grabbed the source code of Autofac to build Autofac.Mvc4 against Mvc3:
hg clone https://code.google.com/p/autofac/ --branch "MVC4 beta" C:\my\path
After using this assembly as my reference ApiController started working but regular Controllers worked ok only for a single controller action call. When the view called Html.RenderAction(...) and when I refresh or navigate to another controller action it crashes with this error:
No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being reqested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
I thought building from the newest source for Autofac.Mvc4 version 2.6.2.859 against Mvc3 could help but I can't find the source for that. Or maybe there's something else wrong in here?
I found the problem. I also used Autofac.Integration.Web to inject dependencies into custom Membership and Role providers. But in WebLiftime.cs there was this line:
public static readonly object Request = "httpRequest";
Once I changed it to:
public static readonly object Request = "AutofacWebRequest";
and used the built assembly everything works fine and I get no errors :)
I believe this constant value should the same as in all projects Autofac.Integration.Web, Autofac.Integration.Mvc and 'Autofac.Integration.WebApi for Mvc4 so this supposedly is a bug.

Resources