我需要开发一个windows服务,每天做几次基本任务,没什么大不了的。作为要求的一部分,它需要一个 Web 界面,以便可以从浏览器进行配置。
例子:
工程师先生打开他的浏览器并输入
localhost:1234/Config
。返回一个简单的 html 网页,允许他输入一些值并将它们发布到服务器。然后,Windows 服务将使用这些新值。
我目前拥有的是两种不同的方法。第一个是通过在我的 ServiceBase 中创建一个 WebServiceHost ,如下所示:
// Provide the base address.
serviceHost = new WebServiceHost(typeof(Service), new Uri(baseAddress));
// Open the ServiceHostBase
serviceHost.Open();
然后我创建一个 IService 并指定一个操作,如下所示:
[OperationContract]
[WebGet]
Stream Get();
最后像这样实现接口:
public Stream Get()
{
UriTemplateMatch uriInfo = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
MemoryStream rawResponse = new MemoryStream();
TextWriter response = new StreamWriter(rawResponse, Encoding.UTF8);
response.Write("<h1>test</h1>");
response.Flush();
rawResponse.Position = 0;
return rawResponse;
}
这很好用。我可以从我的浏览器中查询网络服务并得到想要的结果。
但是,我最近偶然发现了 WebApi,并且通过执行以下操作能够复制同样的成功:
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(new Uri("http://localhost:50231/"));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
// Create server
var server = new HttpSelfHostServer(config);
// Start listening
server.OpenAsync().Wait();
然后通过这样的控制器:
public class HelloController : ApiController
{
public HttpResponseMessage Get()
{
var response = new HttpResponseMessage();
response.Content = new StringContent("<html><body>Hello World</body></html>");
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
}
所以,这是我想出的两种方法来满足要求。其中哪个被认为更好?还是它们都很糟糕,有没有更好的方法?