Windows Communication Foundation (WCF) 允许您创建公开 Web 终结点的服务。Web 终结点通过纯 XML 发送数据,没有 SOAP 信封。本主题演示如何公开这类终结点。
提示
确保 Web 终结点安全的唯一方式是使用传输安全通过 HTTPS 将其公开。使用基于消息的安全时,通常将安全信息放置在 SOAP 标头中,原因是发送到非 SOAP 终结点不包含 SOAP 信封,没有地方放置安全信息,因而必须依赖于传输安全。
创建 Web 终结点
使用以 ServiceContractAttribute, WebInvokeAttribute 和 WebGetAttribute 属性标记的接口来定义服务协定。
提示
默认情况下,WebInvokeAttribute 将 POST 调用映射到操作。不过,可以指定“method=”参数来指定映射到操作的方法。WebGetAttribute 没有“method=”参数并且仅将 GET 调用映射到服务操作。
实现服务协定。
承载服务
创建 WebServiceHost 对象。
添加一个带有 ServiceEndpoint 的 WebHttpBehavior。
提示
如果不添加终结点,则 WebServiceHost 自动创建默认终结点。WebServiceHost 还添加 WebHttpBehavior 并禁用 HTTP 帮助页和 Web 服务描述语言 (WSDL) GET 功能,因此元数据终结点不会影响默认的 HTTP 终结点。
当尝试调用终结点上的操作时,添加 URL 为 "" 的非 SOAP 终结点会导致意外行为。其原因是终结点的侦听 URI 与帮助页(在浏览到 WCF 服务的基址时显示的页)的 URI 相同。要防止此类情况发生,可以执行下列操作之一:
- 总是为非 SOAP 终结点指定非空白 URI。
- 关闭帮助页。这可以通过以下代码来实现。
打开服务主机并等待用户按 Enter。
此示例演示如何使用控制台应用程序来承载 Web 样式服务。还可以在 IIS 内承载这类服务。为此,在 .svc 文件中指定 WebServiceHostFactory 类,如以下代码所示。
<%ServiceHost language=c# Debug="true" Service="Microsoft.Samples.Service" Factory=System.ServiceModel.Activation.WebServiceHostFactory%>
本示例在代码中以强制方式配置 Web 服务主机,您也可以在应用程序配置文件中配置 Web 服务主机。可以使用下面的应用程序配置文件执行与上面列出的代码相同的配置。
<configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.BasicWebProgramming.Service" behaviorConfiguration="MyServiceBehavior"> <host> <baseAddresses> <add baseAddress="https://localhost:8000/"/> </baseAddresses> </host> <endpoint address="" binding="webHttpBinding" contract="Microsoft.ServiceModel.Samples.BasicWebProgramming.IService" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
为了使用应用程序配置文件,必须对先前的代码进行一些修改。不再必须在代码中指定基址、服务行为或终结点。下面的示例演示此修改后的代码。
using (WebServiceHost host = new WebServiceHost(typeof(Service))) { host.Open(); Console.WriteLine("Service is running"); Console.WriteLine("Press enter to quit..."); Console.ReadLine(); host.Close(); }
在 Internet Explorer 中调用映射到 GET 的服务操作
- 打开 Internet Explorer 并键入“https://localhost:8000/EchoWithGet?s=Hello, world!”,然后按 Enter。该 URL 包含服务的基址 ("https://localhost:8000/")、终结点的相对地址 ("")、要调用的服务操作 ("EchoWithGet")、一个问号以及其后通过“and”符号 (&) 分隔的命名参数的列表。
在代码中调用服务操作
创建
using
块内的 ChannelFactory 的实例。将 WebHttpBehavior 添加到 ChannelFactory 将要调用的终结点。
创建通道并调用服务。
关闭 WebServiceHost。
示例
下面列出了此示例的完整代码。
编译代码
编译 Service.cs 时,请引用 System.ServiceModel.dll 和 System.ServiceModel.Web.dll。
另请参见
参考
WebHttpBinding
WebGetAttribute
WebInvokeAttribute
WebServiceHost
ChannelFactory
WebHttpBehavior