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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf diese Artikel http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/
In der Sie beschreiben, wie zu laden ist, zusätzliche Baugruppen mit Steuerungen in Ihnen.
InformationsquelleAutor AndyD
Für self-hosting-Szenario stellen Sie ein benutzerdefiniertes IAssembliesResolver Implementierung als andere Lösungen vorschlagen, und fügen Sie die benötigten Baugruppen, um die Erfassung entweder durch die Verwendung eines Typs in der Steuerung die Montage oder durch den Datei-Pfad.
Dann in einer Konsole-Anwendung die Main-Methode oder in einer service-Klasse, die OnStart-Methode, ersetzen Sie den assembly resolver service.
InformationsquelleAutor NthDeveloper
Ich fand schließlich heraus, wie Sie dies tun, ich hatte zu re-arrangieren, mein code als solchen:
Windows-Dienst:
Klassenbibliothek:
Ich denke, dass dort, wo verschiedene Probleme bei der Konfiguration mit der Lösung, so dass ich löschte alle meine Referenz, und fügte hinzu, nur die, die erforderlich für jedes Projekt.
Danke an alle, die Anregungen gepostet.
Sorry habe vergessen zu beantworten hier. Hatte ich schon gelesen, der Artikel, aber trotzdem danke.
InformationsquelleAutor TheKingDave
Für zukünftige Leser.
Hier ist (eine Möglichkeit), wie Sie eine andere Montage-und IIS verwenden.
und
und (Globale.asax)
InformationsquelleAutor granadaCoder