WebApi controller mit einer Klasse Bibliothek

Ich versuche, ein system zu schaffen, dass wird mir erlauben, host a "WebAPI" website entweder über eine web-Anwendung oder über einen windows-Dienst. Zu diesem Zweck möchte ich alle meine Business-Logik enthalten sein innerhalb einer Klasse in der Bibliothek, so dass ich auf diesen in meinen beiden windows-Dienst und meine "Webserver" (IIS) - Dienst.

Meine aktuelle Idee ist die Verwendung der selbst gehosteten Optionen, die in HttpSelfHostServer. Für die web Ende, ich würde einfach erstellen ein standard-webapi-website und fügen Sie einige Referenz zu meiner Klasse Bibliothek.

Was ich gefunden habe ist, dass wenn ich den controller in der gleichen Namensraum wie die HttpSelfHostServer es funktioniert einwandfrei, aber sobald der controller ist in einer externen Klassenbibliothek kann der server nicht mehr lösen, der Weg zu meinem control /Aktion.

Mein code:

Windows-Dienst:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Reflection;
using System.IO;

using System.Web.Http.SelfHost;
using System.Web.Http;
using System.Web.Http.Dispatcher;

using WebApiClasses;
using WebApiClasses.Controllers;

namespace WebAPISelfHost
{
    public partial class Service1 : ServiceBase
    {
        private HttpSelfHostServer _server;
        private readonly HttpSelfHostConfiguration _config;
        public const string ServiceAddress = "http://localhost:8080";

        public Service1()
        {
            InitializeComponent();

            _config = new HttpSelfHostConfiguration(ServiceAddress);

            //AssembliesResolver assemblyResolver = new AssembliesResolver();
            //_config.Services.Replace(typeof(IAssembliesResolver), assemblyResolver);

            _config.Routes.MapHttpRoute("DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

        }

        protected override void OnStart(string[] args)
        {
            _server = new HttpSelfHostServer(_config);
            _server.OpenAsync();
        }




        protected override void OnStop()
        {
            _server.CloseAsync().Wait();
            _server.Dispose();
        }
    }

    //public class TestController : ApiController
    //{
    //   public string Get()
    //   {
    //       return "This is an internal test message.";
    //   }
    //}

    class AssembliesResolver : DefaultAssembliesResolver
    {
        public override ICollection<Assembly> GetAssemblies()
        {
            ICollection<Assembly> baseAssemblies = base.GetAssemblies();
            List<Assembly> assemblies = new List<Assembly>(baseAssemblies);

            //Add whatever additional assemblies you wish

            var controllersAssembly = Assembly.LoadFrom(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\WebApiClasses.dll");
            baseAssemblies.Add(controllersAssembly);
            return assemblies;
        }
    }
}

Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Web.Http;

namespace WebApiClasses.Controllers
{
    public class TestController : ApiController
    {
        public string Get()
        {
            return "hello from class library";
        }
    }
}

Wenn ich versuche, navigieren Sie zu: "http://localhost:8080/api/" ich:

Keine HTTP-Ressource gefunden wurde, entspricht der request-URI 'http://localhost:8080/api/'.

Keine Art gefunden wurde, passt der regler mit dem Namen 'Test'.

Irgendwelche Vorschläge? Ich denke, ich sollte in der Lage sein, dies zu tun.

Nur um klar zu sein - Sie suchen die Gastgeber Ihr WebAPI-Projekt sowohl in IIS und self-hosted-in einem Windows-Dienst?
Ja im Grunde, host in IIS oder self-hosted, aber noch wichtiger ist ich will nur eine code-Basis, d.h. ich will nicht zu haben, um anderen code für die IIS gehostet Zeug aus der windows-service gehostet Zeug.

InformationsquelleAutor TheKingDave | 2012-12-18

Schreibe einen Kommentar