gpt4 book ai didi

c# - 使用类库的 WebApi Controller

转载 作者:可可西里 更新时间:2023-11-01 08:43:01 27 4
gpt4 key购买 nike

我正在尝试创建一个系统,允许我通过 Web 应用程序或 Windows 服务托管“WebAPI”网站。为此,我希望我的所有业务逻辑都包含在一个类库中,以便我可以在我的 Windows 服务和我的“Web”(IIS) 服务中引用它。

我目前的想法是使用 HttpSelfHostServer 中包含的自托管选项。对于 Web 端,我会创建一个标准的 webapi 网站并添加一些对我的类库的引用。

我发现,如果我的 Controller 与 HttpSelfHostServer 在同一个命名空间中,它可以正常工作,但一旦 Controller 位于外部类库中,服务器就无法再解析到我的控件/操作的路由。

我的代码:

window 服务:

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";
}
}
}

当我尝试导航到:“http://localhost:8080/api/”时,我得到:

找不到与请求 URI“http://localhost:8080/api/”匹配的 HTTP 资源。找不到与名为“测试”的 Controller 匹配的类型。

有什么建议吗?我想我应该能够做到这一点。

最佳答案

看看这篇文章http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/

在其中,他们描述了如何加载带有 Controller 的额外程序集。

关于c# - 使用类库的 WebApi Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com