我正在尝试将自托管的可执行文件作为 Windows 服务运行。我正在使用 MVC 4 beta Web API。首先,我使用Derik Whittaker 的博客来设置基本的控制台应用程序,并对其进行了测试,得到了积极的结果。
然后,我使用Einar Egilsson 的博客将其作为控制台应用程序和 Windows 服务运行。作为服务安装的应用程序就好了。我将服务登录设置为使用我自己的进行此基本测试;如果没有这个,它就无法绑定到套接字。当服务启动时,我按预期看到所有跟踪日志,没有致命错误。该应用程序似乎运行正常。当我使用 fiddler 对控制台应用程序使用相同的请求进行测试时,我收到“HTTP/1.1 500 内部服务器错误”。
当我关闭服务然后在 VS 中使用 F5 启动时使用相同的代码,应用程序启动得很好并提供相同的请求!?日志条目在相同的执行路径中是相同的。
public partial class TestService : ServiceBase {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private HttpSelfHostServer _server;
static void Main(string[] args) {
Logger.Debug("Main Called");
var service = new TestService();
if (Environment.UserInteractive) {
Logger.Debug("Environment.UserInteractive == true");
Console.WriteLine("Press any key to stop program");
service.OnStart(args);
service.OnStop();
} else {
Logger.Debug("Environment.UserInteractive == false");
try {
Run(service);
} catch(Exception exception) {
Logger.Fatal(exception.Message, exception);
}
}
}
protected override void OnStart(string[] args) {
Logger.Debug("OnStart called");
var hostUri = string.Format("http://{0}:{1}", Environment.MachineName, ConfigurationManager.AppSettings["Service.Port"]);
Logger.Debug("URL:" + hostUri);
var selfHostConfiguration = new HttpSelfHostConfiguration(hostUri);
selfHostConfiguration.Routes.MapHttpRoute(
name: "DefaultApiRoute",
routeTemplate: "endpoints/{controller}",
defaults: null
);
Logger.Debug("Routes registered");
try {
using (_server = new HttpSelfHostServer(selfHostConfiguration)) {
Logger.Debug("Hosting at " + hostUri + "/endpoints/{controller}");
_server.OpenAsync().Wait();
if (Environment.UserInteractive) { // *** I've tried this commented out as well
Console.ReadLine();
}
Logger.Debug("End of using");
}
} catch(Exception exception) {
Logger.Fatal(exception.Message, exception);
if(exception.InnerException != null) {
Logger.Fatal(exception.InnerException.Message, exception.InnerException);
}
}
}
protected override void OnStop() {
_server.Dispose();
}
}