2

我需要开发一个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;
    }
}

所以,这是我想出的两种方法来满足要求。其中哪个被认为更好?还是它们都很糟糕,有没有更好的方法?

4

0 回答 0