gpt4 book ai didi

c# - 自托管 ASP.NET Web API 和自托管 SignalR 一起 Windows 服务应用程序

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

我想构建一个 Windows 服务,通过自托管 ASP.NET Web API 提供一些服务。另外,我想通过自托管 SignalR 通知客户一些变化。我认为 ASP.NET SignalR 将是通知中心的完美解决方案。

当我同时运行这两项服务时,它们无法协同工作。如果我删除 SignalR,自托管 API 将开始完美运行。反之亦然:删除 Windows 服务,SignalR 将完美运行。

我不确定我的问题是什么,是否可以同时为 asp.net Web API 和 SignalR 自托管 Windows 服务?

我在相同和不同的端口上都尝试过,但它不起作用。

另一个问题,是否可以将两者都放在同一个端口上?

我安装的包:

Microsoft.AspNet.WebApi.SelfHost
Microsoft.AspNet.SignalR.SelfHost
Microsoft.AspNet.WebApi.Owin
Microsoft.Owin.Host.HttpListener
Microsoft.Owin.Hosting
Microsoft.Owin.Cors

我的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.SelfHost;

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;
using Microsoft.Owin.Cors;
using Microsoft.Owin;

[assembly: OwinStartup(typeof(WindowsService_HostAPI.Startup))]
namespace WindowsService_HostAPI
{
partial class SelfHostService : ServiceBase
{
IDisposable SignalR;

EventLog myLog = new EventLog();
private const string appId = "MYHUB";
public SelfHostService()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
myLog.Source = "MY HUB ";
var config = new HttpSelfHostConfiguration("http://localhost:9090");

config.Routes.MapHttpRoute(
name: "API",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

HttpSelfHostServer server = new HttpSelfHostServer(config);



string CertLocation = "";
server.OpenAsync().Wait();
try
{


myLog.WriteEntry("Notification HUB Start " );
}
catch (Exception ex)
{
myLog.WriteEntry("Notification Failed TO Start : " + ex.Message + " |||| " + CertLocation);
}
// SignalR
string url = "http://localhost:9191";
SignalR = WebApp.Start(url);

}

protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
try
{
push.StopAllServices(true);
SignalR.Dispose();
}
catch (Exception ex)
{
myLog.WriteEntry("Notification Failed TO Stop : " + ex.Message);
}

}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class UserGroupNotification : Hub
{
public void Send(string UGID, string message)
{

Clients.All.addMessage(UGID, message);
}


}
}

最佳答案

我在我的一个 API 上运行这样的配置 - ApiControllers 和 Signalr hub 在同一 URI 上。我认为您的问题出在 app.MapSignalR() 部分。

这是我在配置中的做法:

public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();

//I use attribute-based routing for ApiControllers
config.MapHttpAttributeRoutes();

appBuilder.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration
{

};

map.RunSignalR(hubConfiguration);
});

config.EnsureInitialized(); //Nice to check for issues before first request

appBuilder.UseWebApi(config);
}

关于c# - 自托管 ASP.NET Web API 和自托管 SignalR 一起 Windows 服务应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274527/

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