Pregunta

Me he tomado sugerencias desde aquí para crear esta prueba de integración para mi nuevo proyecto Web Api.Estoy intentando crear un servicio web de descanso y tengo un cliente auxiliar que planeo lanzar a los consumidores de API.Eso es ExampleClientHelper escriba allí.Ah, y por cierto, todo esto llega hasta el ValuesController que se proporciona con la plantilla de proyecto para un proyecto MVC4 Web Api Visual Studio. Mantendré las cosas simples mientras resuelvo esto.

ExampleClientHelper reemplaza toda la solicitud/respuesta en el ejemplo de referencia antes mencionado.esta usando Descanso agudo internamente.

[Test]
[Ignore]
public void ValuesHelper_ShouldReturn_value1_And_value2_AsTypedObject()
{
    // IoC prep
    var builder = new ContainerBuilder();
    var container = builder.Build();

    // web server prep
    var baseUri = new Uri("http://localhost:8080");
    var config = new HttpSelfHostConfiguration(baseUri);
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    // yes, the routing needs to be copied over. it's not compatible with the MVC routes
    config.Routes.MapHttpRoute("Api", "api/{controller}/{id}",
        new { id = RouteParameter.Optional, namespaces = new[] { typeof(ValuesController).Namespace } });

    // start the server and make a request
    new HttpSelfHostServer(config)
        .OpenAsync()
        .ContinueWith(task =>
            {
                var client = new ExampleClientHelper(baseUri);
                var values = client.GetValues();

                // then test the response
                Assert.AreEqual("value1", values.ElementAt(0));
                Assert.AreEqual("value2", values.ElementAt(1));
            })
        .Wait();
}

El código anterior funciona bien siempre y cuando no lo modifiques. ValuesController.es decir.sigue teniendo un constructor implícito sin parámetros.

El problema que tengo es que el servidor autohospedado parece no poder crear una instancia de mi ValuesController cuando lo modifico para requerir una dependencia.El problema es que obtengo la misma excepción en la respuesta de mi cliente asistente ya sea que conecte el Resolución de dependencias de Autofac O no.Esto es lo que se devuelve en el Contenido de la respuesta, muy bien formateado como JSON gracias a RestSharp:

{"ExceptionType":"System.ArgumentException","Message":"El tipo 'Embed.ECSApi.RestServer.Controllers.ValuesController' no tiene un constructor predeterminado","StackTrace":" en System.Linq.Expressions.Expression. Nuevo (tipo de tipo) en System.Web.Http.Internal.TypeActivator.Create[TBase](tipo de instancia) en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(solicitud HttpRequestMessage, HttpControllerDescriptor controladorDescriptor , Escriba tipo de controlador)"}

Claramente el servidor autohospedado está intentando crear ValuesController pero no puede.¿Por qué?Pensé que había conectado correctamente DependencyResolver.En su lugar, espero recibir una excepción de Autofac que se queja de mi dependencia que no he configurado.

¿Fue útil?

Solución

Parece que olvidó registrar el controlador en el contenedor y la API web está intentando crear la instancia por usted.

var builder = new ContainerBuilder();

// Register API controllers using assembly scanning.
builder.RegisterApiControllers(typeof(ValuesController).Assembly);

var container = builder.Build();

También puede registrar el controlador individual si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top