gpt4 book ai didi

c# - 如何从现有的 Windows 服务启动 AspNetCore 应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 22:41:33 26 4
gpt4 key购买 nike

我有一个现有的 Windows 服务。目标是有一个 REST 接口(interface)来与此服务通信。我认为只制作一个 ASP.NET Core Web 应用程序(见屏幕截图)并在我现有的服务中简单地启动整个事情可能是个好主意。然后他们可以共享相同的 IOC 容器等等。

enter image description here

然后我用sc create s1 binPath = "pathgoeshere"注册了服务

当我启动服务(附加到调试进程)时,我在输出窗口中收到错误消息:

Exception thrown: 'System.DllNotFoundException' in Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.dll
The thread 0x5250 has exited with code 0 (0x0).
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
'WindowsService1.exe' (CLR v4.0.30319: WindowsService1.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.ServiceProcess.resources\v4.0_4.0.0.0_de_b03f5f7f11d50a3a\System.ServiceProcess.resources.dll'. Module was built without symbols.
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
The thread 0x4fa0 has exited with code 0 (0x0).
Microsoft.AspNetCore.Server.Kestrel: Warning: Unable to bind to http://localhost:5000 on the IPv4 loopback interface: 'Die DLL "libuv": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.'.
Exception thrown: 'System.DllNotFoundException' in Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.dll
The thread 0x58c4 has exited with code 0 (0x0).
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Exception thrown: 'System.DllNotFoundException' in mscorlib.dll
Microsoft.AspNetCore.Server.Kestrel: Warning: Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Die DLL "libuv": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.'.
Exception thrown: 'System.IO.IOException' in Microsoft.AspNetCore.Server.Kestrel.Core.dll
Exception thrown: 'System.IO.IOException' in mscorlib.dll
Exception thrown: 'System.IO.IOException' in mscorlib.dll
Exception thrown: 'System.IO.IOException' in mscorlib.dll
Microsoft.AspNetCore.Server.Kestrel: Critical: Unable to start Kestrel.

我把整个例子放在了 GitHub 上:

https://github.com/SuperSludge/aspnetcoreService

有没有人做过这样的事情?我完全走错了路吗?将整个 Windows 服务重写为 ASP.NET Core 应用程序是否更容易?

最佳答案

Do you need ASP.NET core application or just expose REST endpoints ? I am thinking you are trying to use it for the benefits of the library. If latter is true,   
I have done a similar thing where we have exposed some REST endpoints hosted in our legacy Windows service through "Microsoft.Owin.Hosting". This looks exactly like the ASP.NET WEPAPI

1) In your windows service, you can start the WebApp like

//WEBAPI URL
private const string WEBAPI_BASEADDRESS = "https://+:{port number}/";
// declare a Idisposable variable
private IDisposable webAPI;
//Use Microsoft Owin's library to start it up
webAPI = WebApp.Start<Startup>(url: WEBAPI_BASEADDRESS);

//above "Startup" is a class you would declare in your other class library (see below number 2)


2) You can create a new C# class library with a class named "Startup" and use the system.Web.Http "Httpconfiguration" class as below

/// <summary>
/// Web API startup method
/// </summary>
public class Startup
{
private const string TOKEN_URL = "/api/token";
private const string BASE_URL = "/api/{controller}/{id}";
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public void Configuration(IAppBuilder appBuilder)
{

// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: BASE_URL,
defaults: new { id = RouteParameter.Optional }
);

appBuilder.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString(TOKEN_URL),
Provider = new CustomAuthorizationServerProvider()
});
appBuilder.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

//Swagger support
SwaggerConfig.Register(config);
//appBuilder.UseCors(CorsOptions.AllowAll);
appBuilder.UseWebApi(config);
}
}

3) Above code has a CustomAuthorizationProvider where you can declare your own Custom OAuth Authorization and do any kind of authentication you want as below

public class CustomAuthorizationServerProvider : OAuthAuthorizationServerProvider

and override the "`public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)`"

4) Then you can just spin up WebAPI controllers
[Authorize]
public class XXXController : ApiController
{
}

Hope this helps . Let me know if something is not clear.

关于c# - 如何从现有的 Windows 服务启动 AspNetCore 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989398/

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