我有一个WCF服务,它将像标准Web服务一样使用,但我还想为各种服务设置提供配置UI。当服务未在IIS中托管时,是否可以提供标准HTML页面?如果是这样,那里有什么“陷阱”?
答案 0 :(得分:6)
WCF是用于创建服务的API。处理“配置网页”超出了此API的范围。如果您真的想要做类似的事情,那就意味着您必须创建另一个REST(webHttp)服务,该服务将公开为您的网页提供服务并接受来自您网页的HTTP POST。这是可能的,但要做很多工作,因为当前的WCF版本doesn't like content type of POSTed HTML forms(application / x-www-form-urlencoded和multipart / form-data)。您可以使用HttpListener以相同的方式实现自己托管的“Web服务器”。
答案 1 :(得分:5)
是的,你可以。这正是在向服务添加HTTP帮助行为时提供WSDL帮助页面的方式。
[ServiceContract]
public interface ITestService
{
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "test")]
Stream GetPage();
}
[ServiceBehavior]
public class TestService : ITestService
{
public Stream GetPage()
{
var pageStream = new FileStream(Path.Combine(Environment.CurrentDirectory, "test.htm"), FileMode.Open, FileAccess.Read, FileShare.Read);
var context = WebOperationContext.Current;
if (context != null)
{
context.OutgoingResponse.ContentType = "text/html";
}
return pageStream;
}
}
您还可以在内存流中构建页面。此外,在WCF 4.5+中,提供HttpResponseMessage类型用于提供html页面。希望这有帮助!
答案 2 :(得分:1)
自托管而不是IIS的陷阱通常包括失去IIS'应用程序池的检测/回收/恢复功能。但是,自托管往往表现得更好。
答案 3 :(得分:0)
是的,这是可能的。您可以在.NET应用程序中托管WCF服务,也可以在HTTP或TCP端口上托管Windows服务。
然后,您必须在另一个Web服务器中托管您的站点,并在Web应用程序中创建对WCF服务的引用。
答案 4 :(得分:0)
这是搜索“自行托管的wcf网页”时的顶部链接,因此尽管我会添加更完整的答案。 @Jared-G的回答很接近,但是我想托管一个Angular应用程序作为WCF服务的前端。这意味着还可以提供任意js / css / img文件。先前答案的扩展:
[ServiceContract]
public interface ITestService
{
// Webpage hosted at {Service URL}/Client
[OperationContract]
[WebGet(UriTemplate = "Client/{*uri}")]
Stream GetPage();
}
[ServiceBehavior]
public class TestService : ITestService
{
public Stream GetPage(string uri)
{
if (uri == "") uri = "test.htm"; // Default page, if root path specified
var basePagePath = "Client\\"; // Default path for webpage, relative to executable directory.
var pageStream = new FileStream(Path.Combine(Environment.CurrentDirectory, basePagePath, uri), FileMode.Open, FileAccess.Read, FileShare.Read);
var context = WebOperationContext.Current;
if (context != null)
{
context.OutgoingResponse.ContentType = "text/html";
}
return pageStream;
}
}