我可以从不在IIS中托管的WCF服务提供网页吗?

时间:2011-05-07 14:22:24

标签: wcf

我有一个WCF服务,它将像标准Web服务一样使用,但我还想为各种服务设置提供配置UI。当服务未在IIS中托管时,是否可以提供标准HTML页面?如果是这样,那里有什么“陷阱”?

5 个答案:

答案 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;
    }
}